Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell中的加入列表_List_Haskell - Fatal编程技术网

List Haskell中的加入列表

List Haskell中的加入列表,list,haskell,List,Haskell,所以我一直在练习Haskell,我做得很好,直到我被困在这个练习中。基本上我想要一个函数,它接收如下列表: xs = [("a","b"),("a","c"),("b","e")] 返回如下内容: xs = [("a",["b","c"]), ("b",["e"])]. 我想出了这个代码: list xs = [(a,[b])|(a,b) <- xs] 如果您不关心最终列表中元组的顺序,最有效的方法(不会重新发明轮子)是使用容器中Data.Map的Map类型: import Data

所以我一直在练习Haskell,我做得很好,直到我被困在这个练习中。基本上我想要一个函数,它接收如下列表:

xs = [("a","b"),("a","c"),("b","e")]
返回如下内容:

xs = [("a",["b","c"]), ("b",["e"])].
我想出了这个代码:

list xs = [(a,[b])|(a,b) <- xs]

如果您不关心最终列表中元组的顺序,最有效的方法(不会重新发明轮子)是使用
容器中
Data.Map
Map
类型:

import Data.Map as Map

clump :: Ord a => [(a,b)] -> [(a, [b])]
clump xs = Map.toList $ Map.fromListWith (flip (++)) [(a, [b]) | (a,b) <- xs]

main = do print $ clump [("a","b"),("a","c"),("b","e")]
导入数据。映射为映射
集群:Ord a=>[(a,b)]->[(a,[b])]
clump xs=Map.toList$Map.fromListWith(flip(+)[(a[b])|(a,b)[(a,b)]->[(a[b])]

clump'xs=[(a,[b |(a',b)您可以使用右折叠:

输出:

./main
[("a",["b","c"]),("b",["e"])]

基本原则是要将“相似”的元素组合在一起

每当您想要将元素分组在一起时,您都可以在
数据.List
中使用
分组
函数。在这种情况下,您需要指定哪些是相似的,因此需要使用
分组方式
版本。
数据.List
中的大多数函数都有一个
-版本,允许您详细指定更多内容我知道你想要什么

第一步 在您的例子中,您希望将“相似性”定义为“具有相同的第一个元素”

换句话说,一对中的第一个元素相等

因此,为了进行分组,我们将该要求提供给
groupBy
,如下所示:

groupBy ((==) `on` fst) xs
在您的示例中,这将使我们回到两个组:

[[("a","b"),("a","c")]
,[("b","e")]]
步骤2 现在剩下的就是将这些列表成对地排列。其基本原则是,如果我们让

ys = [("a","b"),("a","c")]
例如,取第一对中的第一个元素,然后将所有对中的第二个元素合并到一个列表中。取第一对中的第一个元素很容易

fst (head ys) == "a"
接受所有第二个元素也是相当容易的

map snd ys == ["b", "c"]
这两项行动一起给了我们想要的

(fst (head ys), map snd ys) == ("a", ["b", "c"])
成品 因此,如果您愿意,您可以将您的聚集函数编写为

clump xs = (fst (head ys), map snd ys)
  where ys = groupBy ((==) `on` fst) xs

对不起,从现在开始,我将为每个新问题添加一个输出!我刚刚更新了它!谢谢!我删除了我的评论。这是一个有趣的问题。:)是的!因为我知道我必须做什么,我想我很接近了,但我的代码缺少一些东西!从我对Haskell的了解来看,我在那里写了“(a,[b]),应该是b之外的其他东西,我说得对吗?要指出你的错误,当你说
[b]
时,你实际上是在说“返回一个由单个元素b组成的列表”。不幸的是,元素的顺序很重要。所以“a”应该是第一个,“b”第二个,依此类推..我可以只使用Data.List包吗?因为我现在正在学习这部分谢谢!但是如果我导入Data.List而不使用(nub)它不起作用!如果nub函数是这个包的一部分,为什么需要指定?@dcarou:我……不知道。无可否认,Haskell和GHC的变化太快了,我无法跟上,但根据Haskell 2010报告和我的仿古电脑上的GHC的仿古版本,它应该在有和没有
(nub)的情况下工作
。你所说的“不起作用”到底是什么意思?@dcarou:如果我的答案是你问题的答案,接受它并(可选)投票。如果我只想使用数据。列表?
fst (head ys) == "a"
map snd ys == ["b", "c"]
(fst (head ys), map snd ys) == ("a", ["b", "c"])
clump xs = (fst (head ys), map snd ys)
  where ys = groupBy ((==) `on` fst) xs