有人可以告诉我为什么以下代码不起作用吗?
test :: String
test =
do
return ("Hi")
我一直在努力让do语句工作一段时间,我已经把它追到了这个问题。我知道这不是你应该如何做到的,但这整齐地总结了我一直在遇到的问题。
我收到以下错误:
Test.hs:5:21:
Couldn't match expected type `Char' with actual type `[Char]'
In the first argument of `return', namely `("Hi")'
In a stmt of a 'do' block: return ("Hi")
In the expression: do { return ("2") }
更新:啊,我明白了。在我努力抽象到导致我问题的部分时,我刚刚创建了另一个。尽管如此,这无意中导致我无论如何都要解决问题。
答案 0 :(得分:3)
GHCi提供以下内容:
:t do {return ("Hi")}
do {return ("Hi")} :: Monad m => m [Char]
这意味着do {return ("Hi")}
的类型不是String
a.k.a. [Char]
,而是Monad m => m [Char]
。
列表是一个monad,因此它会处理类型中的Monad m
,但会离开[Char];但是,在列表从String
中删除后,剩下的只是Char
,与[Char]
无法匹配,因此会出现错误。
答案 1 :(得分:3)
return
不是关键字 - 它只是一个恰好具有该名称的普通函数。在函数中,表达式自动返回:
test :: String
test = "Hi"
即使您的函数采用了参数,也是如此:
double x = 2 * x
看来你对Haskell来说真的很新。你应该阅读一本很好的书,比如"Learn You a Haskell",以便熟悉它,因为它就像你曾经使用的任何其他语言一样 nothing ,所以你现有的经验不会很有帮助。
答案 2 :(得分:1)
要定义一个常量值(在模块中),只需要
test :: String
test = "Hi"
但我想你正在尝试做IO。