2016-08-26 1 views
0

Я пытаюсь решить одно из упражнений главы в главе 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 и т. Д., Но я не мог точно узнать, как именно).

ответ

3

Он смотрит на меня, как вам просто нужно

myFunction (DaPhone aList) aChar = ... 

разворачивать DaPhone в фактический список.

Смежные вопросы