我试图了解表达式(map . map)
的类型。由于(.)
的类型为(b -> c) -> (a -> b) -> a -> c
,我不明白它如何与map函数一起使用,因为map有两个不符合函数(b -> c)
的参数和(a -> b)
。
答案 0 :(得分:5)
引用GHCI:
Prelude> :t map.map
map.map :: (a -> b) -> [[a]] -> [[b]]
但是对于地图本身,输入是
map :: (a -> b) -> [a] -> [b]
你可以看作
map :: (a -> b) -> ([a] -> [b])
所以,如果我们有那个
(.) :: (t2 -> t3) -> (t1 -> t2) -> t1 -> t3
然后:
t1
为(a -> b)
t2
为([a] -> [b])
t3
为([[a]] -> [[b]])
答案 1 :(得分:1)
我喜欢考虑的一种方式是map
将a -> b
变为[a] -> [b]
,因此map . map
会两次完成。第一张地图将您的a -> b
变为[a] -> [b]
,第二张地图重复该过程,将其转换为[[a]] -> [[b]]
。
"将map
应用于a -> b
会将其变为[a] -> [b]
",因此将map
应用于[a] -> [b]
似乎非常合乎逻辑[[a]] -> [[b]]
会将其变为map
。您只需将-- apply map to a function once
map :: (a -> b) -> ( [a] -> [b] )
-- apply map to a function twice
map . map :: (a -> b) -> ( [[a]] -> [[b]] )
-- apply map to a function three times
map . map . map :: (a -> b) -> ([[[a]]] -> [[[b]]])
应用于某个功能两次。
顺便提及:
onClick(e) {
}