总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"
答案 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_instructor
是String -> Bool
类型的函数,而is_instructor "foo"
是Bool
。
Haskell不允许你随意混合和匹配纯函数和动作。应用函数和执行动作是两回事,需要不同的代码。