Uwaga podpis operatora złożenie funkcji:
(.) :: (b -> c) -> (a -> b) -> a -> c
^ ^ ^
Functions
trwa 2 funkcje, z których każdy ma 1 argumentu, i zwraca do funkcji, które ma argument tego samego typu jak w drugiej funkcji i zwraca ten sam typ co pierwszy.
Twoja próba skomponowania dwóch +
s nie zadziałała, ponieważ +
przyjmuje 2 argumenty, więc bez jakiegoś hackish/creative workway, nie jest to możliwe.
W tym momencie powiedziałbym, że zmuszanie kompozycji, gdy nie pasuje do problemu, po prostu utrudni życie.
Jeśli chcesz, aby podsumować kilka numerów, można napisać funkcję, jak:
sum :: [Int] -> Int
sum nums = foldl (+) 0 nums
Albo, ponieważ nums
pojawia się w tylnej części definicji, to może zostać usunięte całkowicie, dając „punkt- wolne”forma:
sum :: [Int] -> Int
sum = foldl (+) 0
zmniejsza/fałdy +
na liście numerów. Jeśli nie korzystałeś jeszcze z fałd, zajrzyj do nich teraz. Są jednym z głównych sposobów na uzyskanie pętli w Haskell. Zasadniczo jest to "niejawna rekursja", gdy masz do czynienia z listami lub cokolwiek innego, co jest iterowalne.
Dzięki funkcji określonej powyżej, można go używać jak:
sum [1, 2 3, 4, 5]
Iirc, opanowanie wymaga, aby funkcja akceptowała tylko 1 argument. Binarni operatorzy biorą 2 – Carcigenicate
Dlaczego nie po prostu spasować listę używając '+'? – Carcigenicate
@Carcigenicate hmm, to dziwne. Nie spodziewałbym się, że tak będzie. Czy jest jednak jakiś sposób na zrobienie tego? - edit: a co spasować i jaka lista? – theonlygusti