Function Haskell映射和组合函数的使用

Function Haskell映射和组合函数的使用,function,haskell,map,functional-programming,composition,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]] 现在,有人能详细解释一下发生了什么事吗。这个问题的一个关键部分是,我假设map需要一个列表来处

好吧,尽管我知道它在做什么,我还是搞不懂这个

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]]
现在,有人能详细解释一下发生了什么事吗。这个问题的一个关键部分是,我假设map需要一个列表来处理,例如,在第三种情况下,我没有看到两个map被传递

map (length.group) t
这包括函数
length
group
。结果是一个函数,它获取一个列表(字符串)并返回该列表中的“组”数(其中组是重复1次或多次的相同字符序列,因此“abc”包含3个组,“aabbcc”也包含3个组)

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

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

这里是函数
映射长度。group
应用于
t
中的每个字符串,即
映射长度(group str)
t
中的每个字符串
str
计算

map (map length.group) t
这包括函数
length
group
。结果是一个函数,它获取一个列表(字符串)并返回该列表中的“组”数(其中组是重复1次或多次的相同字符序列,因此“abc”包含3个组,“aabbcc”也包含3个组)

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

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

这里是函数
映射长度。group
应用于
t
中的每个字符串,即
映射长度(group str)
是为
t
中的每个字符串
str
计算的,请尝试从所有案例中删除“
长度。
”,看看这是否有助于回答您的问题。这将简化问题,答案可能会让你更好地了解情况

map (map length.group) t
或者,考虑到第三个因素,它变成

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], ...]
此外,还可以尝试使用一些动物,如“鳗鱼”、“蜜蜂”或“骆驼”,以查看最终结果中除1以外的任何内容。

尝试删除所有案例中的“
长度。
”,看看这是否有助于回答您的问题。这将简化问题,答案可能会让你更好地了解情况

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

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], ...]

还可以尝试使用一些动物,如“鳗鱼”、“蜜蜂”或“骆驼”,来查看最终结果中除1以外的任何内容。

提示:
map(f.g)=map f。映射g
,因此您应该能够通过查看
组t
映射组t
的结果来了解发生了什么。请注意,您的第二个组并没有按照您将其隔开的方式进行解析。它实际上被解析为
((map length.group)t
。提示:
map(f.g)=map f。映射g
,因此您应该能够通过查看
组t
映射组t
的结果来了解发生了什么。请注意,您的第二个组并没有按照您将其隔开的方式进行解析。它实际上被解析为
((map length.group)t
。谢谢!还有一个很好的建议,就是与动物相处;)我有点。。。如果删除“长度”,最后一个就不起作用了。。。怎么会呢?如果你不删除长度后的点,如果你按照上面的减少,在最后一行你会得到
[(map)[“A”,“P”,“E”],…]
,这显然没有任何意义。如果你去掉这个点,你会得到
[(地图组)“APE”,…]
,这等于
[[A组,P组,E组],…]
,这也没有任何意义。我不明白你的意思…最后一个组中的length.group我会得到[“A”,“P”,“E”],它在长度之后会给出[1,1],然后传递到“外层”“映射并放入结果列表中。。。难道不应该以同样的方式传递[“A”、“P”、“E”]吗?相反,我得到了一个错误,抱怨“期望[[[a0]]],但发现[[Char]]……对不起,这似乎不重要,但这是我对所有这些的理解的一部分……不,你仍然有内部的
映射
,因此它期望将某些东西映射到
[“A”,“P”,“E”]
,但是没有映射到它的函数。因此,出现了一个奇怪的错误。我想你想象的是
map(group)[“猿”、“猴”、“驴”]
,而不是
map(map group)[“猿”、“猴”、“驴”]
啊,我想我现在明白了……这实际上起了很大的作用,非常感谢:)谢谢!关于动物的建议也不错;)我明白了……如果你去掉“长度”,最后一个就不起作用了……怎么会呢?如果你不去掉一个接一个的点,如果你按照上面的减少,在最后一行你会得到
[(地图)[“a“,“P”,“E”],…]
,这显然没有任何意义。如果你去掉这个点,你会得到
[(地图组)“APE”,…]
,这等于
[[A组,P组,E组],…]
,这也没有任何意义。我不明白你的意思…最后一个组中的length.group我会得到[“A”,“P”,“E”],它在长度之后会给出[1,1],然后传递到“外层”“映射并放入结果列表中。。。难道不应该以同样的方式传递[“A”、“P”、“E”]吗?相反,我得到了一个错误,抱怨“期望[[[a0]]],但发现[[Char]]……对不起,这似乎不重要,但这是我对所有这些的理解的一部分……不,你仍然有内部的
映射
,因此它期望将某些东西映射到
[“A”,“P”,“E”]
,但没有函数