Haskell не может соответствовать ожидаемому типу char?

То, что я пытаюсь сделать, это вызвать функцию, которую я уже создал, в основной ввод-вывод. Функция, которую я вызываю, является функцией высокого порядка, показанной ниже:

filmsByFan' f = map title $ filter (elem f . fans) testDatabase

Это часть кода, которая выдает сообщение об ошибке всякий раз, когда я пытаюсь вызвать эту функцию более высокого порядка:

getInt :: IO Int
getInt = do str <- getLine
            return (read str :: Int)

main :: IO ()
main = do putStrLn "Enter 1. Add Film / 2. Display all Films / 3. Display film by Year / 4. Display film by fan / 5. Display film by actor and period / 6. Become Fan: "
          str <- getLine
          if str == "1"
            then do return ()
                else if str == "2"
            then do putStrLn (displayAllFilms' testDatabase "")
                else if str == "3"
                    then do putStrLn "Enter a film year: "
                        filmyear <- getInt
                        putStrLn (filmsByYear' filmyear)  <<< **ERROR HERE** (154:47)
                 else main

Остальной код до сих пор работает отлично, т.е. если пользователь вводит «2», он запускает функцию displayAllFilms (обратите внимание, что функция displayAllFilms НЕ является функцией более высокого порядка)

Это потому, что функция «высокого порядка», поэтому она выдаст эту ошибку?

Coursework v1.hs:154:47:
    Couldn't match expected type `Char' with actual type `[Char]'
    Expected type: String
      Actual type: [Title]
    In the return type of a call of `filmsByYear''
    In the first argument of `putStrLn', namely
      `(filmsByYear' filmyear)'

Любая помощь приветствуется! заранее спасибо!


person user2240649    schedule 24.04.2013    source источник


Ответы (1)


Expected type: String

Это означает, что на данном этапе программы ghc ожидает найти выражение типа String (поскольку первый аргумент putStrLn должен быть String).

  Actual type: [Title]

Это означает, что выражение, найденное здесь ghc, (filmsByYear' filmyear), имеет тип [Title] (поскольку результат, заданный filmsByYear', равен [Title]).

Если бы ожидаемый тип и фактический тип были одинаковыми, ошибки не было бы.

Предположительно у вас есть type Title = String, поэтому он пытается объединить String с [String], что не удается. (И поскольку type String = [Char], это доходит до попытки объединить [Char] с [[Char]]... что все еще терпит неудачу.)

Возможные способы исправить это:

н.б. Ни putStrLn, ни filmsByYear' не являются функциями высшего порядка.

person dave4420    schedule 24.04.2013