给出了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)
编辑:这么多很好的解释......选择最好的一个并不容易!
看看这个定义出现在Data.Tree:
foldTree :: (a -> [b] -> b) -> Tree a -> b
foldTree f = go where
go (Node x ts) = f x (map go ts)
Run Code Online (Sandbox Code Playgroud)
我的具体问题是:当goname 出现在方程的右侧(map go ts)时,函数的类型如何
(a -> [b] -> b)
Run Code Online (Sandbox Code Playgroud)
被推断?
例如,有这行代码:
foldTree (:) (Node 1 [Node 2 []])
Run Code Online (Sandbox Code Playgroud)
实例化定义:
foldTree (:) = go where
go (Node 1 [Node 2 []]) = (:) 1 (map go [Node 2 []])
Run Code Online (Sandbox Code Playgroud)
(:) 1 (map go [Node 2 []])没有完全评估,所以我只看到 …