Новое в ML: как хранить возвращаемые значения типа a* a* a*
У меня есть программа, которая возвращает int * int
(Пример для иллюстрации): забавная программа (a, b) = (1,2)
Я хочу сделать что-то вроде:
Веселая программа (a, b)
если a = 0, то (1,2)
else
val x, y = программа (a-1, b)
возврат (x-1, y)
В принципе, я хочу манипулировать возвращаемым кортежем, а затем возвращать его модификацию.
Спасибо
2 ответа:
Это работает почти так же, как вы написали, за исключением того, что ваш синтаксис немного не таков:
fun program(a,b) = if a = 0 then (1,2) else let val (x,y) = program(a-1,b) in (x-1, y) end
Конкретно:
Функции
- определяются через
fun f args = body
- вы пропустили=
.- переменные связаны с
let val foo = bar in baz end
.- в sml нет ключевого слова return.
Я также хотел бы предложить, что в то время как вам нужно возвращать тип
t : int * int
, вы можете по крайней мере curry входные данные для вашей функции из :int * int = int -> int
. Если вам нужно повернуть это назад, вы всегда можете uncurry . Я бы предложил написать функцию следующим образом:fun program a b = if a = 0 then (1,2) else let val (x,y) = program (a - 1) b in (x - 1, y) end
Тип этой функции:
int -> int -> (int * int)