Вы, конечно же, слышали, что Haskell - это чисто функциональный язык. Это означает (среди прочего), что единственное, что функция может делать в Haskell, - это результат, зависящий от аргументов; функция не может делать I/O или имеет результат, зависящий от чего-то другого, кроме значений аргументов.
Но Haskell позволяет вам писать программы, которые делают I/O и другие эффектные вещи. Как это возможно? Ну, это значит, что в Haskell вещи, которые выполняют ввод-вывод или побочные эффекты, не являются функциями; они что-то другое. Люди часто называют их действиями. Операции ввода-вывода в Haskell имеют типы форм IO a
.
Ошибка, которую вы получаете здесь, заключается в том, что main
, точкой входа в программу Haskell, требуется действие типа IO()
. Но is_instructor
является функцией типа String -> Bool
, а is_instructor "foo"
является Bool
.
Haskell не позволяет вам смешивать и сочетать чистые функции и действия так беспорядочно. Применение функции и выполнение действия - это две разные вещи, и для этого потребуется другой код.
Отлично, что работает. Спасибо. Поэтому, если бы я хотел поставить подпись на основном методе, будет ли она «main :: IO Bool» еще? –
Нет, поскольку вы печатаете, это будет 'Main :: IO()'. Печать не дает ничего интересного, поэтому 'print :: Show a => a -> IO()'. –
Извините, все еще смущен. Когда я использую подпись Main :: IO(), я получаю «Недопустимая подпись типа: Main :: IO(). Должен иметь форму :: ».Кроме того, должен ли я определять сопроводительную привязку печати, если я использую print :: Show a => a -> IO()? –