在没有第二个参数的情况下如何使用合成运算符?

Maa*_*den 4 haskell function-composition

我碰到了的用法。我不太了解的运算子。

我本人试图对此进行推理,但得出的结论与GHCI产生的结论不同。

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

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

last :: [a] -> a
(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)

我感到困惑的功能是这样的:

(last .)
Run Code Online (Sandbox Code Playgroud)

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

(last .) :: (b -> [c]) -> (a -> b) -> a -> [c]
Run Code Online (Sandbox Code Playgroud)

什么:t实际上给了我是这样的:

(last .) :: (a -> [c]) -> a -> c
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 6

这是中缀运算符部分 [Haskell-wiki]的示例:

(...)

(2^)(左侧部分)等效于(^) 2,或更详细地说\x -> 2 ^ x

所以我们在这里构造了一个看起来像这样的函数:

\f -> last . f
Run Code Online (Sandbox Code Playgroud)

或更短:

(.) last
Run Code Online (Sandbox Code Playgroud)

(.) :: (b -> c) -> (a -> b) -> a -> c函数有两个函数gh,并创建一个功能\x -> g (h x)g因此,这里last

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