Czy operator kompozycji() (np. val x = foo o bar
, gdzie foo
i bar
są obie funkcje), możliwe do użycia tylko w funkcjach jednoargumentowych i/lub funkcjach z równą liczbą argumentów? Jeśli nie, jaka jest składnia, na przykład, komponowanie foo(x,y)
z .Czy operator SML `o` jest użyteczny tylko w przypadku funkcji pojedynczego argumentu?
Odpowiedz
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.
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
.
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.
Bardzo pomocna. Wielkie dzięki! – GregT
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. –
Jesper: W tym przypadku prawdopodobnie zdefiniowałbym operatora $ i 'sign $ bar xy'. – Tayacan