Haskell 中 map.map 的类型是什么?
What is the type of map.map in Haskell?
我想找到map.map的类型。第一张图片是我找到的解决方案,但我不太明白。我的解决方案就像第二张图片中的那样,但这是错误的。我不明白解决方案的标记位。为什么会这样?
简答:箭头类型构造函数(->)
是一个右结合运算符。
箭头是右结合的。这意味着如果你写:
map :: (d -> e) -> [d] -> [e]
更详细,您写道:
map :: (d -> e) -> ([d] -> [e])
因此,鉴于 (.)
的第一个参数具有类型 (a -> b)
,因此这意味着类型 (d -> e) -> ([d] -> [e]) ~ a -> b
(~
表示相同类型),因此 a ~ d -> e
和 b ~ [d] -> [e]
。当我们用第二个 map
.
输入 check 时,当然也是如此
考虑到这一点,我们因此,就像节点所说的那样得出:
(.) map map :: (f -> g) -> ([[f]] -> [[g]])
因此这意味着此函数采用类型 f -> g
的函数,并将列表列表中的所有元素映射到维护结构的列表列表。
例如:
Prelude> (.) map map (+1) [[1,4,2,5], [], [1,3], [2]]
[[2,5,3,6],[],[2,4],[3]]
我想找到map.map的类型。第一张图片是我找到的解决方案,但我不太明白。我的解决方案就像第二张图片中的那样,但这是错误的。我不明白解决方案的标记位。为什么会这样?
简答:箭头类型构造函数(->)
是一个右结合运算符。
箭头是右结合的。这意味着如果你写:
map :: (d -> e) -> [d] -> [e]
更详细,您写道:
map :: (d -> e) -> ([d] -> [e])
因此,鉴于 (.)
的第一个参数具有类型 (a -> b)
,因此这意味着类型 (d -> e) -> ([d] -> [e]) ~ a -> b
(~
表示相同类型),因此 a ~ d -> e
和 b ~ [d] -> [e]
。当我们用第二个 map
.
考虑到这一点,我们因此,就像节点所说的那样得出:
(.) map map :: (f -> g) -> ([[f]] -> [[g]])
因此这意味着此函数采用类型 f -> g
的函数,并将列表列表中的所有元素映射到维护结构的列表列表。
例如:
Prelude> (.) map map (+1) [[1,4,2,5], [], [1,3], [2]]
[[2,5,3,6],[],[2,4],[3]]