给出了Haskell函数:
head . filter fst
Run Code Online (Sandbox Code Playgroud)
现在的问题是如何手动"手动"找到类型.如果我让Haskell告诉我我得到的类型:
head . filter fst :: [(Bool, b)] -> (Bool, b)
Run Code Online (Sandbox Code Playgroud)
但是我想了解它是如何工作的,只使用已定义如下的已使用函数的签名:
head :: [a] -> a
(.) :: (b -> c) -> (a -> b) -> a -> c
filter :: (a -> Bool) -> [a] -> [a]
fst :: (a, b) -> a
Run Code Online (Sandbox Code Playgroud)
编辑:这么多很好的解释......选择最好的一个并不容易!
在Edward Kmett的演讲中,Lenses,Folds和Traversals,在幻灯片"The Power is the Dot"中,他展示的(.) . (.) . (.)是
(a -> b) -> (c -> d -> e -> a) -> c -> d -> e -> b
我可以通过在GHCI中显示它的类型来看到它.但我也想知道原因.我想了解的另一件事是为什么有在从参数中经常换着花样(.)来(.) . (.)和(.) . (.) . (.):
(.) :: (a -> b) -> (c -> a) -> c -> b
(.) . (.) :: (a -> b) -> (c -> d -> a) -> c -> d -> b
(.) . …Run Code Online (Sandbox Code Playgroud) haskell types type-inference combinators function-composition