我正在尝试确定(.) map const
的类型。
(.) map
的类型给了我(a1 -> a2 -> b) -> a1 -> [a2] -> [b]
const
的类型为a -> b -> a
因此,当我尝试执行(.) map const
时,(a1 -> a2 -> b)
的{{1}}是否应该与(.) map
中的(a -> b -> a)
统一?
因此,const
与a1
统一,a
与a2
统一,b
与b
统一。
我剩下a
有了统一,它应该让我a1 -> [a2] -> b
但是,正确答案是a -> [b] -> [a]
有人可以解释如何以及为什么吗?
答案 0 :(得分:13)
a -> [b] -> [a]
和b -> [a] -> [b]
是同一类型(例如foo -> [bar] -> [foo]
)。类型变量的名称没有意义,因此只要相同的变量位于相同的位置,它们的标签就无关紧要。
答案 1 :(得分:8)
回答您对@JosephSible答案的评论,看来GHCi统一支持map
中的类型变量。这仅仅是操作的顺序,是任意的:
map' :: (mapA -> mapB) -> [mapA] -> [mapB]
map' = map
dot :: (dotB -> dotC) -> (dotA -> dotB) -> dotA -> dotC
dot = (.)
const' :: constA -> constB -> constA
const' = const
和
*Main> :t dot map' const'
dot map' const' :: mapB -> [mapA] -> [mapB]