我正在尝试确定的类型(.) map const。
(.) map给我的类型(a1 -> a2 -> b) -> a1 -> [a2] -> [b]
的类型const是a -> b -> a
所以,当我试图做的(.) map const,不应该(a1 -> a2 -> b)的(.) map统一与(a -> b -> a)从const?
因此,a1用相结合a,a2用相结合b,b用相结合a。我留下了a1 -> [a2] -> b
与统一,它应该留给我a -> [b] -> [a]
但是,正确的答案是 b -> [a] -> [b]
有人可以解释如何以及为什么吗?
Jos*_*ica 13
a -> [b] -> [a]和b -> [a] -> [b]是相同的类型(例如foo -> [bar] -> [foo])。类型变量的名称没有意义,因此只要相同的变量位于相同的位置,它们的标签就无关紧要。
在回答您对@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)
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |