function - 地图地图与地图地图
问题描述
我是 Haskell 的新手,我认为 Haskell 中的功能map map
和map.map
相同。我的终端给了我两种不同的类型,
(map.map) :: (a -> b) -> [[a]] -> [[b]]
和
(map map) :: [a -> b] -> [[a] -> [b]]
这些函数在语法方面有何不同,它们各自的确切含义是什么?
解决方案
该map map
表达式将第二个map
作为第一个的参数。所以这意味着如果我们派生类型,我们会看到:
map :: ( a -> b ) -> ([a] -> [b])
map :: (c -> d) -> ([c] -> [d])
-----------------------------------------------
a ~ (c -> d), b ~ [c] -> [d]
因此,这意味着 与a
具有相同的类型c -> d
,并且与b
具有相同的类型[c] -> [d]
。因此,这意味着 的类型map map
是:
map map :: [a] -> [b]
:: [c -> d] -> [[c] -> [d]]
因此,此处map map
将类型函数列表作为参数c -> d
,并且它将生成执行与这些函数的映射的函数列表。
因此,这意味着如果你写:
(map map) [(+1), (*2), (-3)]
你检索到类似的东西:
[map (+1), map (*2), map (-3)]
情况并非如此map . map
。这个表达式等价于(.) map map
。该(.) :: (b -> c) -> (a -> b) -> a -> c
函数接受两个函数f
和g
,并将它们组合为\x -> f (g x)
。因此,类型意味着:
(.) :: ( b -> c ) -> (( a -> b ) -> (a -> c))
map :: (d -> e) -> ([d] -> [e])
map :: (f -> g) -> ([f] -> [g])
-------------------------------------------------------------------------
b ~ d -> e ~ [f] -> [g], c ~ [d] -> [e], a ~ f -> g, d ~ f, e ~ g
的类型(.) map map
是这样的:
(.) map map :: a -> c
:: (f -> g) -> ([d] -> [e])
:: (f -> g) -> ([[f]] -> [[g]])
该函数接受一个类型f -> g
为 的函数,并将生成一个函数,该函数接受一个f
s 列表的列表,并且它可以将这些映射到g
s。
因此(map . map) (+1)
将生成一个函数,以便:
(map . map) (+1) [[1,4,2,5],[1,3,0,2]]
它将生成:
[[2,5,3,6], [2,4,1,3]]
推荐阅读
- javascript - RequireJS:“express”和“cors”的脚本错误,但不知道如何修复它
- bash - 在循环中询问用户输入,直到在命令行参数数组中找到匹配项
- ios - 如何修改现有的 iOS 应用程序以支持拆分视图
- html - 输入从哪里获得额外的宽度?
- python - Visual Studio Code 和 Autopep8 格式化程序
- python - 求解微分方程时,Numba prange 函数比范围慢
- javascript - 如何在不增加小时数的情况下将 GTM-0006 转换为 ISO
- node.js - Node.js关于如何在html中成功显示信息的问题
- scheme - 在方案中获取树的有序叶子
- html - CSS column-count 3 使单个列