将列表映射到类型中

时间:2015-10-08 13:14:32

标签: haskell databags

我正在尝试将列表[“a”,“b”,“c”,“c”]转换为haskell中的一个集合,例如:[(“a”,1),(“b”,1 ),( “C”,2)]。我不是想使用地图。我的功能如下:

-- bagMyItem
bagMyItem :: Eq g => [g] -> Bag g -> Bag g
bagMyItem  (h:t) bag
     | h==q = (q,v+1):(listToBag t bag)  
     | null rBag = bag ++ [(h,1)]     
     | otherwise = (q,v):(listToBag (h:t) rBag)
     where ((q,v):rBag) = bag

我做错了什么,或者我错过了这个?

1 个答案:

答案 0 :(得分:1)

以下是我对如何解决此问题的建议:

步骤1:最初我会用具体类型编写函数。当你犯错误时,你会得到更少的神秘错误信息。稍后你可以返回并使函数具有多态性。

第2步:让我们选择@Transactional作为我们的具体类型。写一个包含单个Char的函数:

Char

步骤3:使用此功能编写一个包含整个项目列表的功能:

type Bag g = [ (g,Int) ]

bagSingleItem :: Char -> Bag Char -> Bag Char
bagSingleItem c [] = ...
bagSingleItem c ( (d,v) : bag ) = ...

步骤4.使您的函数具有多态性。您需要做的就是通过将bagItems :: [Char] -> Bag Char -> Bag Char bagItems [] bag = ... bagItems (c:cs) bag = ... bagSingleItem ... 替换为类型变量来更改bagSingleItembagItems的类型签名,并添加Char约束:

Eq ...

或者 - 甚至更好 - 完全删除类型签名并让ghci告诉你它们对bagSingleItem :: Eq g => g -> Bag g -> Bag g (definition remains the same) bagItems :: Eq g => [g] -> Bag g -> Bag g (definition remains the same) 命令的作用:

:t