如果没有第二个参数,组合运算符的这种用法如何工作?
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
函数采用两个函数 g
和 h
,并创建一个函数 \x -> g (h x)
。因此这里 g
是 last
.
因此我们创建了一个函数,它将函数 f :: b -> [c]
作为输入,然后 returns last . f
.
我遇到了 .我不太明白的运算符。
我自己试着推理了一下,但是得出的结论和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
函数采用两个函数 g
和 h
,并创建一个函数 \x -> g (h x)
。因此这里 g
是 last
.
因此我们创建了一个函数,它将函数 f :: b -> [c]
作为输入,然后 returns last . f
.