(。)map const的类型

stu*_*fcs 5 haskell types

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

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

的类型consta -> b -> a

所以,当我试图做的(.) map const,不应该(a1 -> a2 -> b)(.) map统一与(a -> b -> a)const

因此,a1用相结合aa2用相结合bb用相结合a。我留下了a1 -> [a2] -> b 与统一,它应该留给我a -> [b] -> [a]

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

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

Jos*_*ica 13

a -> [b] -> [a]b -> [a] -> [b]是相同的类型(例如foo -> [bar] -> [foo])。类型变量的名称没有意义,因此只要相同的变量位于相同的位置,它们的标签就无关紧要。

  • 如果您想了解有关此属性的更多信息,则将其称为 _alpha equivalence_。 (2认同)

Tho*_*son 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
Run Code Online (Sandbox Code Playgroud)

*Main> :t dot map' const'
dot map' const' :: mapB -> [mapA] -> [mapB]
Run Code Online (Sandbox Code Playgroud)