Я пытаюсь решить одно из упражнений главы в главе 11 «Алгебраические типы данных» в Haskell Book. Но я застрял в ошибке типа, не могу понять, почему работает очень схожая функция, а другая - нет.Почему контролер типа GHC не похож на одну из двух функций, которые выглядят почти одинаково?
Это, как я начинаю:
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
и т. Д., Но я не мог точно узнать, как именно).