2017-02-12 2 views
1

Я начал изучать Haskell и читал «Learn You Haskell». Глава 8, посвященная «созданию собственных типов и типов», и у меня есть сообщение об ошибке, которое является проблемой для меня. Вероятно, решение крошечное, но я не мог его найти, поэтому, пожалуйста, сообщите нам подсказку и помогите мне объяснить.Не удалось совместить ожидаемый тип Лицо с фактическим типом IO()

data Person = Person { firstName :: String 
        , lastName :: String 
        , age :: Int 
        } deriving (Eq, Show, Read) 

mikeD = Person {firstName = "Michael", lastName = "Diamond", age = 43} 

main = print $ read "Person {firstName =\"Michael\", lastName =\"Diamond\", age = 43}" :: Person 

Это сообщение об ошибке я получаю

Couldn't match expected type `Person' with actual type `IO()' 
In a stmt of a 'do' block: 
    print 
    $ read 
     "Person {firstName =\"Michael\", lastName =\"Diamond\", age = 43}" :: 
     Person 
In the expression: 
    do { print 
     $ read 
      "Person {firstName =\"Michael\", lastName =\"Diamond\", age = 43}" :: 
     Person } 
In an equation for `main': 
    main 
     = do { print 
      $ read 
       "Person {firstName =\"Michael\", lastName =\"Diamond\", age = 43}" :: 
       Person } 

Спасибо заранее :)

+4

Попробуйте добавить parens вокруг инструкции чтения. – Reactormonk

+0

'print (читать" Person {firstName = \ "Michael \", lastName = \ "Diamond \", age = 43} ":: Person)' работает. Я надеюсь, что кто-то объяснит, почему он не эквивалентен вашей '' 'версии! Я предполагаю, что область аннотации типа является синтаксической. –

+0

привет Jean-Baptiste, спасибо и да, работает, Tamas – bling5630

ответ

5
main = 
    print $ read "Person {firstName =\"Michael\", lastName =\"Diamond\", age = 43}" :: Person 

обрабатывается как

main = 
    (print $ read "Person {firstName =\"Michael\", lastName =\"Diamond\", age = 43}") :: Person 

в то время как вы означало

main = 
    print (read "Person {firstName =\"Michael\", lastName =\"Diamond\", age = 43}" :: Person) 
+0

привет Зета, спасибо за комментарий, пример ясен, Tamas – bling5630

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