2012-04-11 2 views
2

Всего Haskell noob здесь. У меня простая функция, и главное. Я не имею ни малейшего представления, что значит эта ошибка:Ожидаемый тип и основная

Couldn't match expected type `IO t0' with actual type `Bool' 
In the expression: main 
When checking the type of the function `main' 

при компиляции кода:

is_instructor :: String -> Bool 
is_instructor "Jeremy Erickson" = True 
is_instructor x = False 

main :: Bool 
main = is_instructor "foo" 

ответ

4

main вещь, которая вызывается при запуске программы. Ожидается, что программа каким-то образом взаимодействует с внешним миром (чтение ввода, вывод на печать, такие вещи), поэтому разумно, что main должен иметь тип IO something. По соображениям безопасности и простоты типа, это требование в Haskell, например, main на Java должно иметь тип public static void main(String[] arrgh).

Вы, вероятно, хотели вы дорожите для печати, так

main :: IO() 
main = print $ is_instructor "foo" 

будет то, что вы хотите.

+0

Отлично, что работает. Спасибо. Поэтому, если бы я хотел поставить подпись на основном методе, будет ли она «main :: IO Bool» еще? –

+0

Нет, поскольку вы печатаете, это будет 'Main :: IO()'. Печать не дает ничего интересного, поэтому 'print :: Show a => a -> IO()'. –

+0

Извините, все еще смущен. Когда я использую подпись Main :: IO(), я получаю «Недопустимая подпись типа: Main :: IO(). Должен иметь форму :: ».Кроме того, должен ли я определять сопроводительную привязку печати, если я использую print :: Show a => a -> IO()? –

2

Вы не можете иметь main функцию с типом Bool, она всегда должна быть в IO Монада. То, что вы, вероятно, хотите, это что-то вроде , распечатав это булевское значение. Тогда просто сделай это!

main :: IO() 
main = print $ is_instructor "foo" 
+0

Таким образом, это будет 'main :: IO Bool, main = return (is_instructor" foo ")'. –

+0

@NiklasB. нет! Основная функция не может напрямую возвращать любые значения, она должна использовать монаду 'IO' для _interact_ с окружающей средой. – leftaroundabout

+0

Я, должно быть, спал, публикуя этот комментарий. Конечно, я имел в виду «IO Bool», но сам функционал тоже не был действителен. Haskell:/Конечно, это не имеет большого смысла, потому что ничего не выводит, но это прямой перевод OP пример :) –

2

Вы, конечно же, слышали, что Haskell - это чисто функциональный язык. Это означает (среди прочего), что единственное, что функция может делать в Haskell, - это результат, зависящий от аргументов; функция не может делать I/O или имеет результат, зависящий от чего-то другого, кроме значений аргументов.

Но Haskell позволяет вам писать программы, которые делают I/O и другие эффектные вещи. Как это возможно? Ну, это значит, что в Haskell вещи, которые выполняют ввод-вывод или побочные эффекты, не являются функциями; они что-то другое. Люди часто называют их действиями. Операции ввода-вывода в Haskell имеют типы форм IO a.

Ошибка, которую вы получаете здесь, заключается в том, что main, точкой входа в программу Haskell, требуется действие типа IO(). Но is_instructor является функцией типа String -> Bool, а is_instructor "foo" является Bool.

Haskell не позволяет вам смешивать и сочетать чистые функции и действия так беспорядочно. Применение функции и выполнение действия - это две разные вещи, и для этого потребуется другой код.

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