2013-02-04 24 views

Odpowiedz

16

Jak już Michael powiedział, tak, SML ma tylko funkcje pojedynczego argumentu. Chciałbym jednak trochę rozwinąć.

Poniższa funkcja:

fun foo (x,y) = x + y 

ma typ:

fn : int * int -> int 

co oznacza, że ​​pierwszy argument jest krotka dwie wskazówki. Więc można zrobić coś takiego:

(sign o foo) (4,~5) 

co dałoby Ci taka sama jak sign (foo (4,~5)).

Dobra, ale co z czymś takim?

fun bar x y = x + y 

Ma typ:

fn : int -> int -> int 

co oznacza, że ​​bar faktycznie zajmuje tylko jedną liczbę całkowitą i zwraca funkcję. Więc nie możesz tego zrobić:

(sign o bar) 4 ~5 

Ponieważ pasek zwraca funkcję, a znak przyjmuje liczbę całkowitą. Możesz to zrobić:

(sign o bar 4) ~5 

Ponieważ bar 4 to funkcja dodająca 4 do liczby.

+0

Bardzo pomocna. Wielkie dzięki! – GregT

+2

Jeśli zdefiniowałeś funkcję 'uncurry', która ułatwi ci ostatni" problem "z' sign o bar', a być może także funkcją 'flip', która może odwrócić" porządkowanie argumentów "przez odwrócenie pary' (x, y) ' do '(y, x)', itd. –

+0

Jesper: W tym przypadku prawdopodobnie zdefiniowałbym operatora $ i 'sign $ bar xy'. – Tayacan

6

SML ma tylko funkcje pojedynczego argumentu; foo(x,y) to funkcja foo przyjmująca pojedynczy argument, krotka (x, y). W związku z tym nie jest wymagana żadna specjalna obsługa i trzeba będzie zwrócić krotkę odpowiedniego typu, aby skomponować ją z foo.

3

Widziałem pewien standardowy kod ML (szczególnie kod Poly/ML Isabelle/Pure), który wprowadza operatorów dodatkowych kompozycji w środowisko najwyższego poziomu, które radzi sobie z taką sytuacją. Np .:

fun (f oo g) x y = f (g x y) 
fun (f ooo g) x y z = f (g x y z) 
fun (f oooo g) x y z w = f (g x y z w) 

Generalnie takie rzeczy powinny być stosowane z umiarem (cztery lub więcej o jest już trochę głupie), ale jest to dość przydatna posiadający co najmniej oo dookoła.