0

有人能告诉我为什么下面的代码不起作用吗?

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") }

更新:啊,我明白了。在我努力抽象到导致我出现问题的部分时,我刚刚创建了另一个问题。尽管如此,这确实无意中让我解决了这个问题。

4

3 回答 3

3

GHCi 给出以下信息:

:t do {return ("Hi")}
do {return ("Hi")} :: Monad m => m [Char]

这意味着do {return ("Hi")}不是Stringaka类型[Char],而是Monad m => m [Char].

列表是一个 monad,因此它会处理Monad m类型中的 ,但会留下 [Char];但是从 中取出列表后String,剩下的只是Char,无法匹配[Char],所以报错。

于 2013-04-24T20:03:00.267 回答
3

return在 Haskell 中不是关键字——它只是一个正常的函数,恰好有这个名字。在函数中,表达式会自动返回:

test :: String
test = "Hi"

即使您的函数带有参数也是如此:

double x = 2 * x

看来您对 Haskell 很陌生。您应该阅读一本好书,例如“Learn You a Haskell”来熟悉它,因为它与您曾经使用过的任何其他语言完全不同,因此您现有的经验不会很有帮助。

于 2013-04-24T20:03:01.967 回答
1

要定义一个常量值(在模块内),您只需要

test :: String
test = "Hi"

但我猜你正在尝试做 IO。

您学习 Haskell for the Great Good!

于 2013-04-24T20:01:59.933 回答