Haskell使用map和组合函数

时间:2012-10-03 13:00:34

标签: function haskell map functional-programming composition

好吧,即使我知道它在做什么,我也无法解决这个问题......

let t = ["APE", "MONKEY", "DONKEY"]

现在考虑三种情况:

map (length.group) t
(map length.group) t
map (map length.group) t

这将返回以下三个答案:

[3,6,6]
[1,1,1]
[[1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]

现在,有人可以向我详细解释发生了什么。这个问题的一个关键部分是我假设地图需要一个列表来处理,例如,我没有看到在第三个案例中传递了两个地图。

2 个答案:

答案 0 :(得分:4)

map (length.group) t

这包含函数lengthgroup。结果是一个函数,它接受一个列表(字符串)并返回该列表中“组”的数量(其中一个组是重复一次或多次的相同字符的序列,因此“abc”包含3个组,所以“为aabbcc”)。

然后使用t将此函数应用于map中的每个字符串。

(map length.group) t

这里函数map length(它取列表列表中每个子列表的长度)由函数group组成,组合函数应用于t。换句话说,它与map length (group t)相同。

map (map length.group) t

此处,函数map length . group应用于t中的每个字符串,即map length (group str)中的每个字符串str都会计算t

答案 1 :(得分:2)

尝试从所有案例中删除“length.”,看看这是否有助于回答您的问题。它会简化问题,答案可能会让你更好地了解正在发生的事情。

或者,考虑第三个因素,它就变成了

map (map length.group) ["APE", "MONKEY", "DONKEY"]
--make parse order explicit
map ((map length) . group) ["APE", "MONKEY", "DONKEY"]
--do mapping
[((map length) . group) "APE", ((map length) . group) "MONKEY", ((map length) . group) "DONKEY"]
--use (f.g) x == f (g x)
[(map length) (group "APE"), ...]
[(map length) ["A", "P", "E"], ...]
[[1, 1, 1], ...]

同时尝试使用“EEL”或“BEE”或“LLAMA”等动物在最终结果中查看除1之外的任何动物。