Новое в 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 2

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

Конкретно:

    Функции
  1. определяются через fun f args = body - вы пропустили =.
  2. переменные связаны с let val foo = bar in baz end.
  3. в 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)