Обратите внимание на подпись оператора функции состава:
(.) :: (b -> c) -> (a -> b) -> a -> c
^ ^ ^
Functions
Это занимает 2 функции, каждая из которых принимают 1 аргумент, и возвращает функцию, которая принимает аргумент одного и того же типа, что и второй функции , и возвращает тот же тип, что и первый.
Ваша попытка составить два +
s не сработала, так как +
принимает 2 аргумента, поэтому без какого-либо хакерского/творческого обходного пути это невозможно.
На данный момент я бы сказал, что форсирующая композиция, когда она не соответствует этой проблеме, просто затруднит вашу жизнь.
Если вы хотите суммировать несколько номеров, вы могли бы написать функцию, как:
sum :: [Int] -> Int
sum nums = foldl (+) 0 nums
Или, так как nums
появляется в задней части определения, он может быть удален в целом, уступая «навел бесплатно»форма:
sum :: [Int] -> Int
sum = foldl (+) 0
Это уменьшает/складывает +
по списку номеров. Если вы еще не использовали складки, смотрите в них сейчас. Они являются одним из основных способов достижения цикла в Haskell. Это, по сути, «неявная рекурсия», когда вы имеете дело со списками или что-то еще итеративное.
С выше функции, определенной, вы можете использовать его как:
sum [1, 2 3, 4, 5]
Iirc, самообладание требует, чтобы функция принимала только один аргумент. Каждый бинарный оператор принимает 2 – Carcigenicate
И почему бы не просто свернуть его с помощью '+'? – Carcigenicate
@ Карциген, хм, это странно. Я бы не ожидал, что так будет. Есть ли способ сделать это? - отредактируйте: и что складывается, и какой список? – theonlygusti