(。)map const的类型

时间:2019-05-12 23:23:32

标签: haskell types

我正在尝试确定(.) map const的类型。

(.) map的类型给了我(a1 -> a2 -> b) -> a1 -> [a2] -> [b]

const的类型为a -> b -> a

因此,当我尝试执行(.) map const时,(a1 -> a2 -> b)的{​​{1}}是否应该与(.) map中的(a -> b -> a)统一?

因此,consta1统一,aa2统一,bb统一。 我剩下a 有了统一,它应该让我a1 -> [a2] -> b

但是,正确答案是a -> [b] -> [a]

有人可以解释如何以及为什么吗?

2 个答案:

答案 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]