首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从列表创建包/multiset

从列表创建包/multiset
EN

Stack Overflow用户
提问于 2020-09-23 10:00:54
回答 1查看 142关注 0票数 1

这必须是超级简单的,我错过了一些东西。我无论如何也想不到该怎么做。我需要从列表中创建一个包。我试过了:

代码语言:javascript
复制
ins n [] = [(n,1)]
ins n ((x,y):xys)
  |n == x    = (x, y + 1):xys
  |otherwise = (x,y): ins x xys

fromList [] = []
fromList (x:xs) = ins x [] : bag xs

这显然不像预期的那样工作,递归在这里对我不利。insert函数确实可以工作,但是我不知道如何继续添加到相同的列表中,而不是我正在做的事情

编辑:可能应该说得更具体些,抱歉。Bag将是数据类型,其中Bag a = [(element, number of occurrences in list)]可能也称为multiset。因此列表2,2,3,4,2,3将变为(2,3),(3,2),(4,1)

我对Haskell和一般的编程都是非常陌生的,所以我再次为我对它的抽象而道歉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-23 15:15:14

你就快成功了。你可能想要的是:

代码语言:javascript
复制
fromList [] = []
fromList (x:xs) = ins x (fromList xs)

如果你看一下类型,就会更容易看出哪里出了问题。在固定版本中:

代码语言:javascript
复制
ins :: (Eq a, Num b) => a -> [(a,b)] -> [(a,b)]
fromList :: (Eq a, Num b) => [a] -> [(a,b)]

fromList的原始版本中,您应该会得到一个错误,因为bag是未定义的;但假设您的意思是:

代码语言:javascript
复制
fromList [] = []
fromList (x:xs) = ins x [] : fromList xs

推断的类型为:

代码语言:javascript
复制
fromList :: (Eq a, Num b) => [a] -> [[(a,b)]]

它返回的不是袋子类型[(a,b)],而是袋子列表[[(a,b)]]

这个版本实际上所做的是将每个元素包装成一个单独的包;基本上与map (\ x -> ins x [])相同。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64019976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档