相关疑难解决方法(0)

Haskell:如何手动推断表达式的类型

给出了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)

编辑:这么多很好的解释......选择最好的一个并不容易!

haskell types type-inference unification

13
推荐指数
4
解决办法
1955
查看次数

理解 foldTree 函数的类型推导

看看这个定义出现在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 []])没有完全评估,所以我只看到 …

tree haskell types type-inference fold

1
推荐指数
1
解决办法
99
查看次数

标签 统计

haskell ×2

type-inference ×2

types ×2

fold ×1

tree ×1

unification ×1