2013-10-03 1 views
2

мне интересно, если список не является префиксом второго списка, используя следующий код:Inferred типа не достаточно общий

prefix :: [a] -> [b] -> Bool 
prefix [] _ = True 
prefix _ [] = False 
prefix (x:xs) (y:ys) = if (x==y) then prefix xs ys else False 

Но он возвращает ошибку:

Inferred type is not general enough 
*** Expression : prefix 
*** Expected type : [a] -> [b] -> Bool 
*** Inferred type : [a] -> [a] -> Bool 

Can кто-то помогает мне заставить это работать?

ответ

10

Ваша подпись типа утверждает, что два списка могут иметь разные типы, но они не могут. Поэтому компилятор жалуется, что он вывел тип, который был менее общим, чем тот, который вы просили.

7

Это потому, что вы сравниваете типы, которые вы назвали a и b, используя (x==y). Проверка типа ==, что означает, что они имеют одинаковый тип, который имеет проверку равенства:

Prelude> :t (==) 
(==) :: Eq a => a -> a -> Bool 

Так тип подписи, которая выводится на самом деле Eq a => [a] -> [a] -> Bool.

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

  • Нет связанных вопросов^_^