GHCi のリストから最後の項目を削除するには、リストを逆にし、テールを取得してから、もう一度逆にします。例えば、
reverse(tail(reverse([1,2,3,4])))
そこには非常に多くのブラケットがあるので、代わりに関数合成を使用するように変更すると思いました。ただし、これを試してみると、次のエラーが発生します。
Prelude> reverse . tail. reverse [1,2,3,4]
<interactive>: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]'
これは を構成するのが好きではないことを意味していると思うreverse [1,2,3,4]
ので、括弧で囲んでみましたが、同じエラーが発生します。
Prelude> reverse . tail. (reverse [1,2,3,4])
<interactive>: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]
このエラーの原因は何ですか? let バインディングがこれを停止するのはなぜですか?