我正在尝试解决Haskell Book中第11章“代数数据类型”中的一章练习。但是我陷入了类型错误,无法理解为什么一个非常相似的函数起作用,而另一个却不起作用。
这是我的开始方式:
type Digit = Char
type Presses = Int
data DaPhone =
DaPhone [(Char, Digit, Presses)]
deriving Show
myPhone :: DaPhone
myPhone =
DaPhone [('a', '2', 1), ('b', '2', 2), ('c', '2', 3)]
reverseTaps :: DaPhone -> Char -> [(Digit, Presses)]
reverseTaps aPhone aChar = foldr f [] aPhone
where f (c, d, p)
| c == aChar = ((d, p):)
f _ = id
并得到以下错误:
daPhone.hs:29:39: Couldn't match expected type ‘t0 (Char, Digit, Presses)’ …
with actual type ‘DaPhone’
In the third argument of ‘foldr’, namely ‘aPhone’
In the expression: foldr f [] aPhone
Compilation failed.
但是,如果我尝试使用几乎相同的类型使用几乎相同的功能,例如:
myList :: [(Char, Char, Int)]
myList = [('a', '2', 1), ('b', '2', 2), ('c', '2', 3)]
myFunction :: [(Char, Char, Int)] -> Char -> [(Char, Int)]
myFunction aList aChar = foldr f [] aList
where f (c, d, p)
| c == aChar = ((d,p):)
f _ = id
它可以按预期进行编译和工作:
λ> myFunction myList 'a'
[('2',1)]
λ> myFunction myList 'b'
[('2',2)]
λ> myFunction myList 'c'
[('2',3)]
那么,为什么在中会出现类型错误reverseTaps
,这与之非常相似myFunction
?(我猜这是关于DaPhone的定义的,这意味着也许我需要在中进行更多的模式修补foldr
,等等,但我无法确切地找到方法)。
在我看来,您只需要
myFunction (DaPhone aList) aChar = ...
解开DaPhone
实际清单。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句