如果没有第二个参数,组合运算符的这种用法如何工作?

How does this usage of the composition operator work without a second argument?

我遇到了 .我不太明白的运算符。

我自己试着推理了一下,但是得出的结论和GHCI得出的结论不一样

我正在使用 :t 检查表达式的类型。

我使用的函数是 last(.),它们具有以下签名:

last :: [a] -> a
(.) :: (b -> c) -> (a -> b) -> a -> c

我困惑的函数是这样的:

(last .)

我不确定这个构造是什么,但我认为它类似于函数组合。 根据我的推理,我希望这会产生以下功能:

(last .) :: (b -> [c]) -> (a -> b) -> a -> [c]

:t实际上给我的是:

(last .) :: (a -> [c]) -> a -> c

这是infix operator sectioning [Haskell-wiki]的例子:

(...)

(2^) (left section) is equivalent to (^) 2, or more verbosely \x -> 2 ^ x.

所以我们在这里构建了一个函数,如下所示:

<b>\f -></b> last . <b>f</b>

或更短:

(.) last

(.) :: (b -> c) -> (a -> b) -> a -> c 函数采用两个函数 gh,并创建一个函数 \x -> g (h x)。因此这里 glast.

因此我们创建了一个函数,它将函数 f :: b -> [c] 作为输入,然后 returns last . f.