2014-01-27 2 views
0

Я стараюсь, чтобы получить симметричную разность двух списков:Haskell: добавить сигнатуру типа, которая фиксирует эти переменные типа?

, такие как:

[1,2,3] [2,3,5] 

результат [1]

Это мой код:

getlist _ []=[] 
getlist [] _ = [] 
getlist (x:xs) ys = if isexist x ys 
      then x++ getlist xs ys 
        else 
         getlist xs ys 
isexist a [] = False 
isexist a (x:xs) = if a == x 
      then True 
      else isexist a xs 

Существует ошибка :

The type variable 'a0' is ambiguous

Possible fix: add a type signature that fixes these type variable(s)

Что это значит? Как я могу это исправить?

+0

'then x: (getlist xs ys)'? –

+0

Код, который вы указали, фактически не вызывает ошибок. Задавая вопрос, предоставьте достаточную информацию для других, чтобы воспроизвести точную проблему, с которой вы столкнулись. – kosmikus

ответ

3

Чтобы исправить эту ошибку, все, что вам нужно сделать, как @Joker_vD указал, чтобы заменить вашу ++ с :

Чтобы понять разницу между ними, вы должны смотреть на тип подписи:

(:) :: a -> [a] -> [a] 
(++) :: [a] -> [a] -> [a] 

Как вы могли видеть, : берет элемент и список и возвращает список назад. ++, с другой стороны, принимает два списка.

Вы должны посмотреть на пакеты Data.Set и Data.List, если вы хотите более эффективно установить пересечения/diff.

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

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