2012-05-21 3 views
0

Я пытаюсь создать собственный тип списка в haskell, но моя реализация содержит ошибки. Каков правильный способ сделать это приятно. Пожалуйста, объясните мне немного. Спасибо.Мой тип списка в haskell

Мой код: Код

data List a = EmptyList | ListElement a (List a) 

instance (Show a) => Show (List a) where 
     show = showList' 

showList' EmptyList = showString "[]" 
showList' (ListElement a EmptyList) = show a 
showList' (ListElement a b) = show a ++ show " " ++ showList' b 

Ошибка:

[1 of 1] Compiling Main    (tipusok.hs, interpreted) 

tipusok.hs:12:39: 
    Couldn't match expected type `Prelude.String -> Prelude.String' 
       with actual type `[Char]' 
    Expected type: ShowS 
     Actual type: Prelude.String 
    In the return type of a call of `show' 
    In the expression: show a 
Failed, modules loaded: none. 

ответ

3
showList' EmptyList = showString "[]" 

Тип showStringString -> ShowS является. ShowS является синонимом типа для String -> String, поэтому результат showString "[]" является функцией, которая добавляет строку "[]" к ее аргументу. Поскольку вы не указали сигнатуру типа, это уравнение определяет, какой тип выводится для функции, но другие уравнения не соответствуют этому типу.

Вы, наверное, хотели просто

showList' EmptyList = "[]" 
+0

:) он работает, спасибо – flatronka

4

Ваш состав show функций неверен. Я думаю, вы хотите интерполировать ценности.

showList' (ListElement a b) = show a . showChar ' ' . show b 

должно быть что-то вроде:

showList' (ListElement a b) = show a ++ " " ++ showList' b 
+0

спасибо, это рекурсивный вызов является обязательным, я сделал правку с новым сообщением об ошибке – flatronka

+1

'showChar' не возвращает' String'. Я думаю, вы хотите использовать пробельный литерал? –

+0

спасибо, я сделал редактирование снова, но он все еще не работает – flatronka

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