Skład funkcji to sposób połączenia dwóch lub więcej funkcji. Jest często porównywany do rurociągów muszli. Na przykład, w powłoce Unix stylu, można napisać coś podobnego
cat foo.txt | sort -n | less
ten biegnie cat
, karmi swoje wyjście do sort
i karmi wyjście od tego, do less
.
Ściśle, jest to podobne do operatora Haskell $
. Możesz napisać coś w stylu:
sum $ sort $ filter (> 0) $ my_list
Zauważ, że w przeciwieństwie do przykładu powłoki, odczytuje od prawej do lewej. Zaczynamy od my_list
jako danych wejściowych, a następnie uruchamiamy nad nim filter
, a następnie je sort
, a następnie obliczamy wartość .
Operator składu funkcji, .
, robi coś podobnego. Powyższy przykład wytwarza numer o numerze; Poniższy przykład tworzy funkcję:
sum . sort . filter (> 0)
Zauważ, że w rzeczywistości nie karmić listę do tego. Zamiast tego właśnie stworzyliśmy nową funkcję i możemy podać kilka różnych list do tej funkcji.Na przykład, można nazwać tę funkcję:
my_function = sum . sort . filter (> 0)
Albo może przekazać go jako argument do innej funkcji:
map (sum . sort . filter (> 0)) my_lists
Można w zasadzie wykorzystać go w dowolnym miejscu, które można użyć dowolnego innego rodzaju funkcji . To tylko szybki i czytelny sposób powiedzenia "Chcę połączyć te funkcje razem".
Jak to się dzieje, że nie trzeba pokazywać parametru wejściowego w definicji? Na przykład. dlaczego nie piszesz 'myOdd x = nie. nawet x'? – unclerojelio
@unclerojelio Nazywa się styl bez punktów. Zamiast definiować 'myOdd' pod względem wyniku dla danego argumentu (" Given 'x',' myOdd' zwraca taką samą wartość jak '(not. Even) x'), jest zdefiniowane pod względem tego, co faktycznie is ("' myOdd' to funkcja, która powstaje, gdy 'not' jest złożony z' even' "). – chepner