2

总 Haskell 菜鸟在这里。我有一个简单的功能,和一个主要的。我不知道这个错误是什么意思:

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

3 回答 3

4

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

您可能希望您重视被打印,所以

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

会是你想要的。

于 2012-04-11T14:01:53.643 回答
2

你肯定听说过 Haskell 是一种纯粹的函数式语言。这意味着(除其他外)一个函数在 Haskell 中唯一能做的就是计算一个取决于参数的结果。函数不能执行 I/O,或者其结果取决于参数值以外的其他内容。

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

您在这里遇到的错误是,mainHaskell 程序的入口点必须是类型为 的操作IO ()。Butis_instructor是 type 的函数String -> Bool,并且is_instructor "foo"Bool.

Haskell 不允许您像那样随意混合和匹配纯函数和动作。应用函数和执行动作是两件不同的事情,需要不同的代码。

于 2012-04-11T19:03:56.840 回答
2

你不能有一个main带有 type 的函数Bool,它总是需要在IOmonad 中。您可能想要的是打印出这个布尔值之类的东西。然后就这样做!

main :: IO()
main = print $ is_instructor "foo"
于 2012-04-11T13:56:25.730 回答