2010-09-17 2 views
2

У меня есть программа, которая возвращает Int * IntНового ОД: Как сохранить возвращаемые значения типа а * а * а *

(пример для иллюстрации): прикольной программа (а, Ь) = (1,2)

Я хочу сделать что-то вдоль линий:

прикольной программы (а, б)
, если а = 0, то (1,2)
еще
Вала х, y = программа (a-1, b)
возвращение (х-1, у)

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

Благодаря

ответ

1

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

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

Я хотел бы также предположить, что в то время как вы потребность возвращать тип 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)