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