预期类型和主要

时间:2012-04-11 13:53:52

标签: haskell

总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"

3 个答案:

答案 0 :(得分:4)

main是运行程序时调用的东西。预计程序会以某种方式与外部世界交互(读取输入,打印输出,此类事物),因此main应具有类型IO something是合理的。出于类型安全和简单的原因,这是Haskell中的一项要求,例如Java中的main必须具有类型public static void main(String[] arrgh)

您可能希望打印价值,所以

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

就是你想要的。

答案 1 :(得分:2)

您不能拥有类型为main的{​​{1}}函数,它始终需要位于Bool monad中。您可能想要的是打印出这个布尔值。然后就这样做!

IO

答案 2 :(得分:2)

你肯定听说过Haskell是一种纯粹的功能语言。这意味着(除其他外)函数在Haskell中唯一能做的就是计算依赖于参数的结果;函数不能执行I / O,或者具有依赖于参数值之外的其他结果的结果。

但是Haskell允许你编写执行I / O和其他有效功能的程序。这怎么可能?嗯,这意味着在Haskell中,执行I / O或副作用的东西不是函数;他们是另一回事。人们经常将它们称为行动。 Haskell中的I / O操作具有IO a形式的类型。

您在这里遇到的错误是main(Haskell程序的入口点)必须是IO ()类型的操作。但is_instructorString -> Bool类型的函数,而is_instructor "foo"Bool

Haskell不允许你随意混合和匹配纯函数和动作。应用函数和执行动作是两回事,需要不同的代码。