在Haskell中统一类型

s_q*_*w23 3 haskell types functional-programming unify

关于我的考试,我有点不满意.我想通过手工应用统一算法找出这两个函数的类型:

map map
(\x -> x >>= (\y -> y))
Run Code Online (Sandbox Code Playgroud)

有人能指出我正确的方向吗?直到现在我唯一能找到的资源是维基百科条目,由于抽象程度很高,它并没有真正帮助我.

问候,谢谢.

scl*_*clv 5

我们先做第一个.

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

现在我们可以用两个不同的名称再次编写它,为清楚起见:

map :: (c -> d) -> [c] -> [d]
Run Code Online (Sandbox Code Playgroud)

现在我们将第二个替换为第一个参数,得到:

(a -> b) === (c -> d) -> ([c] -> [d]) (recall the associativity of (->))
a === (c -> d)
b === ([c] -> [d])
Run Code Online (Sandbox Code Playgroud)

现在我们将这些类型分配替换为第一个签名的剩余部分,获取

map map :: [c -> d] -> [[c] -> [d]]
Run Code Online (Sandbox Code Playgroud)

明确?