Haskell 预期类型和主要类型
我是哈斯克尔·努布。我有一个简单的函数和一个main。我不知道这个错误意味着什么:Haskell 预期类型和主要类型,haskell,Haskell,我是哈斯克尔·努布。我有一个简单的函数和一个main。我不知道这个错误意味着什么: 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" =
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"
不能使用类型为
Bool
的main
函数,它必须始终位于IO
monad中。您可能想要的是打印出这个布尔值。那就这么做吧
main :: IO()
main = print $ is_instructor "foo"
main
是运行程序时调用的东西。预计程序会以某种方式与外部世界进行交互(读取输入、打印输出等),因此,main
应该具有类型IO something
。出于类型安全和简单的原因,这是Haskell中的一个要求,比如Java中的main
必须具有类型公共静态void main(String[]arrgh)
你可能希望你的价值被打印出来,所以
main::IO()
main=打印$is\u讲师“foo”
将是您想要的。您肯定听说过Haskell是一种纯粹的函数式语言。这意味着(除其他外)函数在Haskell中唯一能做的事情就是计算一个依赖于参数的结果;函数不能执行I/O操作,或者其结果依赖于参数值以外的内容 但是Haskell允许您编写执行I/O和其他有效操作的程序。这怎么可能?这意味着在Haskell中,执行I/O或副作用的东西不是函数;它们是另外一回事。人们通常把它们称为行动。Haskell中的I/O操作的类型为
IO a
这里出现的错误是,main
,Haskell程序的入口点,必须是IO()
类型的操作。但是,是一个String->Bool
类型的函数,而是一个Bool
Haskell不允许像这样随意地混合和匹配纯函数和操作。应用函数和执行操作是两件不同的事情,需要不同的代码。因此,它将是main::IO Bool,main=return(is_讲师“foo”)
@NiklasB。不主函数不能直接返回任何值,它必须使用IO
monad与环境交互。我一定是在发布评论时睡着了。当然,我的意思是IO Bool
,但是函数体本身也不是有效的Haskell:/当然这没有什么意义,因为它不输出任何东西,但它是OP示例的直接翻译:)太好了,可以了。非常感谢。因此,如果我想在main方法上添加签名,它还会是“main::IO Bool”吗?不会,因为您正在打印,所以它会是main::IO()
。打印不会产生任何有趣的内容,因此print::Show a=>a->IO()
。抱歉,仍然感到困惑。当我使用Main::IO()签名时,我得到“无效类型签名:Main::IO()。应为以下形式:”。另外,如果使用print::Show a=>a->IO(),是否应该定义附带的打印绑定?main
必须以小写字母开头。以大写字母开头的标识符是类型、构造函数或类。抱歉,我的评论中有一个输入错误。main
不是一个函数,不说清楚也没用,IMHO。