Новое в ML: как хранить возвращаемые значения типа a * a * a * - PullRequest
2 голосов
/ 17 сентября 2010

У меня есть программа, которая возвращает int * int

(Пример для иллюстрации): забавная программа (a, b) = (1,2)

Я хочу что-то сделать вместестроки:

забавная программа (a, b)
если a = 0, то (1,2)
else
val x, y = программа (a-1,б)
return (x-1, y)

По сути, я хочу манипулировать возвращаемым кортежем, а затем вернуть его модификацию.

Спасибо

Ответы [ 2 ]

1 голос
/ 17 сентября 2010

Это работает почти так же, как вы написали, за исключением того, что ваш синтаксис немного отключен:

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 нет ключевого слова возврата.
0 голосов
/ 17 августа 2017

Я также хотел бы предложить, чтобы хотя требовалось для возврата типа t : int * int, вы можете по крайней мере карри входные данные для вашей функции из : 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)

...