如何将我自己的数据构造函数转换为Haskell中的列表

如何将我自己的数据构造函数转换为Haskell中的列表,haskell,type-constructor,Haskell,Type Constructor,在使用Python之后,我刚刚开始尝试Haskell,在理解它时遇到了很多问题 例如,在我尝试创建一个名为ListBag的新类型并编写一个简单的函数将list转换为ListBag之后,我无法返回并使用该数据执行任何操作: data ListBag a = LB [(a,Int)] deriving (Show,Eq) fromList :: (Ord a) => [a] ->ListBag a fromList xs = LB [ y| y<- ys]

在使用Python之后,我刚刚开始尝试Haskell,在理解它时遇到了很多问题

例如,在我尝试创建一个名为ListBag的新类型并编写一个简单的函数将list转换为ListBag之后,我无法返回并使用该数据执行任何操作:

data ListBag a = LB [(a,Int)] deriving (Show,Eq)

fromList :: (Ord a) => [a] ->ListBag a
fromList xs = LB [ y| y<- ys]
            where ys = toList(fromListWith (+) [(x, 1) | x <- xs])

a :: [Integer]
a=[1,1,1,1,1,1,2,2,2,3,3,3,3,4,5,5]
b = fromList a
因为
b
b::ListBag Integer
所以无法映射或。。。
那么我如何才能将它再次转换为列表呢?

首先,您的
列表包不保存元素在初始列表中的顺序,但是。。。您可以将
列表包a
转换为
[a]
,如下所示:

toList::列表包a->[a]
toList(LB ys)=concat$(\(y,n)->复制ny)ys

您可以将您的
fromList
重新定义为

fromlistxs=LB$toList$fromListWith(+)[(x,1)| xAhh,monads

toList :: ListBag a -> [a]
toList (LB l) = do
  (what, howmany) <- l
  replicate howmany what
toList::列表包a->[a]
toList(磅/升)=do

(什么,多少)@SergeyKuz1001的答案非常好。当你准备提高它的水平时,你可以使用
列表
的Monad实例,以及一些组合符来使列表
非常简洁

toList::列表包a->[a]
toList(LB-ys)=ys>>=未修剪(翻转复制)

\case{LB x->x}
[y|y@user2407038很抱歉,我没有完全理解,你能解释更多吗?像你这样的人的存在,他们耐心地与初学者分享他们的经验,肯定会让这个世界变得更美好…@radrow
toList :: ListBag a -> [a]
toList (LB l) = do
  (what, howmany) <- l
  replicate howmany what
toList (LB l) =
  [x | (what, howmany) <- l, x <- replicate howmany what]