Чтобы раздеть последний пункт из списка в GHCi, я могу полностью изменить список, взять хвост и затем полностью изменить его снова. Например,
reverse(tail(reverse([1,2,3,4])))
Как есть довольно много скобок там, я думал, что изменю его, чтобы использовать композицию функций вместо этого. Однако, когда я пробую это, я получаю следующую ошибку.
Prelude> reverse . tail. reverse [1,2,3,4]
:2:17:
Couldn't match expected type `a0 -> [a1]' with actual type `[a2]'
In the return type of a call of `reverse'
Probable cause: `reverse' is applied to too many arguments
In the second argument of `(.)', namely `reverse [1, 2, 3, 4]'
In the second argument of `(.)', namely
`tail . reverse [1, 2, 3, 4]'
Я думаю, что это означает, что этому не нравится сочинять перемену [1,2,3,4]
, таким образом, я пытался поместить скобки вокруг этого, но это дает мне ту же самую ошибку.
Prelude> reverse . tail. (reverse [1,2,3,4])
:3:18:
Couldn't match expected type `a0 -> [a1]' with actual type `[a2]'
In the return type of a call of `reverse'
Probable cause: `reverse' is applied to too many arguments
In the second argument of `(.)', namely `(reverse [1, 2, 3, 4])'
In the second argument of `(.)', namely
`tail . (reverse [1, 2, 3, 4])'
Но если я делаю следующий, это работает правильно.
Prelude> let f = reverse . tail . reverse
Prelude> f [1,2,3,4]
[1,2,3]
Что вызывает эту ошибку и почему закрепление, которому позволяют, мешает этому произойти?