我正在尝试将列表[“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
我做错了什么,或者我错过了这个?
答案 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 ...
替换为类型变量来更改bagSingleItem
和bagItems
的类型签名,并添加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