Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 预期类型和主要类型_Haskell - Fatal编程技术网

Haskell 预期类型和主要类型

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

我是哈斯克尔·努布。我有一个简单的函数和一个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" = 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。