Haskell 从列表创建包/多集

Haskell 从列表创建包/多集,haskell,Haskell,这一定非常简单,我错过了一些东西。我一辈子都想不出该怎么做。我需要从列表中创建一个包。 我试过: 这显然没有达到预期的效果,递归在这里对我不利。insert函数确实有效,但我不知道如何继续添加到同一个列表中,而不是我在做什么 编辑:可能应该更具体一些,道歉。Bag将是数据类型,其中Bag a=[元素,列表中出现的次数] 可能也称为多集。 因此列表[2,2,3,4,2,3]将变成[2,3,3,2,4,1] 我对Haskell和编程基本上都是新手,所以我再次为我对它的抽象表示歉意。你几乎已经了解了它

这一定非常简单,我错过了一些东西。我一辈子都想不出该怎么做。我需要从列表中创建一个包。 我试过:

这显然没有达到预期的效果,递归在这里对我不利。insert函数确实有效,但我不知道如何继续添加到同一个列表中,而不是我在做什么

编辑:可能应该更具体一些,道歉。Bag将是数据类型,其中Bag a=[元素,列表中出现的次数] 可能也称为多集。 因此列表[2,2,3,4,2,3]将变成[2,3,3,2,4,1]


我对Haskell和编程基本上都是新手,所以我再次为我对它的抽象表示歉意。

你几乎已经了解了它。您可能想要的是:

fromList [] = []
fromList (x:xs) = ins x (fromList xs)
如果您查看这些类型,就更容易看出哪里出了问题。在固定版本中:

ins :: (Eq a, Num b) => a -> [(a,b)] -> [(a,b)]
fromList :: (Eq a, Num b) => [a] -> [(a,b)]
在fromList的原始版本中,您应该会得到一个错误,因为bag未定义;但假设你的意思是:

fromList [] = []
fromList (x:xs) = ins x [] : fromList xs
推断的类型将是:

fromList :: (Eq a, Num b) => [a] -> [[(a,b)]]
它不会返回行李类型[a,b],而是返回行李列表[[a,b]]


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

您几乎已经得到了它。您可能想要的是:

fromList [] = []
fromList (x:xs) = ins x (fromList xs)
如果您查看这些类型,就更容易看出哪里出了问题。在固定版本中:

ins :: (Eq a, Num b) => a -> [(a,b)] -> [(a,b)]
fromList :: (Eq a, Num b) => [a] -> [(a,b)]
在fromList的原始版本中,您应该会得到一个错误,因为bag未定义;但假设你的意思是:

fromList [] = []
fromList (x:xs) = ins x [] : fromList xs
推断的类型将是:

fromList :: (Eq a, Num b) => [a] -> [[(a,b)]]
它不会返回行李类型[a,b],而是返回行李列表[[a,b]]


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

这里的“包”到底是什么意思?我模模糊糊地听说它是一种数据结构,但当我查找它时,唯一的结果是关于Java中特定的Bag类。@bradrn抱歉,伙计,我已将我的帖子编辑得更具体了谢谢@BoomerNoobProgrammer!这让你更容易理解你想做什么,我想我能看到你现在的错误所在。提示:在fromList中,您当前正在将每个项目添加到一个空列表[],此时您应该将其添加到在递归步骤fromList xs中制作的包中。同样在ins函数的递归步骤中:否则=x,y:ins x xys,x应为n。否则=x,y:ins n xysw你这里的“包”到底是什么意思?我模模糊糊地听说它是一种数据结构,但当我查找它时,唯一的结果是关于Java中特定的Bag类。@bradrn抱歉,伙计,我已将我的帖子编辑得更具体了谢谢@BoomerNoobProgrammer!这让你更容易理解你想做什么,我想我能看到你现在的错误所在。提示:在fromList中,您当前正在将每个项目添加到一个空列表[],此时您应该将其添加到在递归步骤fromList xs中制作的包中。同样在ins函数的递归步骤中:否则=x,y:ins x xys,x应为n。即,否则=x,y:ins n xys