Haskell中的统一类型

Haskell中的统一类型,haskell,types,functional-programming,unify,Haskell,Types,Functional Programming,Unify,我被一个关于考试的任务缠住了。我想通过手动应用统一算法找出这两个函数的类型: map map (\x -> x >>= (\y -> y)) 有人能给我指一下正确的方向吗?到目前为止,我唯一能找到的资源是维基百科条目,由于高度抽象,它并没有真正帮助我 问候并感谢您。让我们做第一件事 map :: (a -> b) -> [a] -> [b] 为了清楚起见,现在我们可以用两个不同的名字再写一遍: map :: (c -> d) -> [c]

我被一个关于考试的任务缠住了。我想通过手动应用统一算法找出这两个函数的类型:

map map
(\x -> x >>= (\y -> y))
有人能给我指一下正确的方向吗?到目前为止,我唯一能找到的资源是维基百科条目,由于高度抽象,它并没有真正帮助我


问候并感谢您。

让我们做第一件事

map :: (a -> b) -> [a] -> [b]
为了清楚起见,现在我们可以用两个不同的名字再写一遍:

map :: (c -> d) -> [c] -> [d]
现在我们将第二个替换为第一个的第一个参数,得到:

(a -> b) === (c -> d) -> ([c] -> [d]) (recall the associativity of (->))
a === (c -> d)
b === ([c] -> [d])
现在,我们将这些类型分配替换为第一个签名的剩余部分,即

map map :: [c -> d] -> [[c] -> [d]]

清除?

映射的类型是
map:(a->b)->[a]->[b]
。因此,通过将
a
b
替换为可以从
foo
的类型,从
[a]->[b]
中获得
map foo
的类型。例如,如果
foo::t->t
,则替换
a=t,b=t
,并获得
[t]->[t]
。如果
foo::[t]>Int
,则获得
[[t]]->[Int]

在您的例子中,
foo
(即
map
)的类型是
(x->y)->[x]->[y]
。您必须将该类型与
a->b
相统一,以找出
a
b
必须替换的内容。[请注意,函数箭头是右关联的,
x->y->z=x->(y->z)
]

查找

\x -> x >>= (\y -> y)
使用已知类型的
(>>=)::Monad m=>ma->(a->mb)->mb
。暂时忽略约束(
Monad m=>

作为
(>>=)
的第一个参数,
x
必须为未知的
m
a
指定类型
ma
(>>=)
的第二个参数是标识

(\y -> y) :: t -> t
因此,您必须将
t->t
a->mb
统一起来。这将为您提供有关
a
的一些信息,即
a=mb

这就给出了
x::m(mb)
,和
(\x->x>>=(\y->y))::x的类型->rhs的类型


最后,请记住暂时忘记的约束
Monad m=>

我想他们也要求解释一下类型统一的一般情况。非常感谢。这个解释正是我要寻找的。这正是我一直错过的社交活动。很棒的帖子。这是我发现的对初学者最友好的信息来源:还有这个,这是一个更深入的解释。谢谢你的回答澄清了很多。非常感谢您投入的时间。