Haskell返回与预期不匹配

时间:2013-04-24 19:58:18

标签: haskell return return-type

有人可以告诉我为什么以下代码不起作用吗?

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

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

3 个答案:

答案 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)

Haskell中的

return不是关键字 - 它只是一个恰好具有该名称的普通函数。在函数中,表达式自动返回:

test :: String
test = "Hi"

即使您的函数采用了参数,也是如此:

double x = 2 * x

看来你对Haskell来说真的很新。你应该阅读一本很好的书,比如"Learn You a Haskell",以便熟悉它,因为它就像你曾经使用的任何其他语言一样 nothing ,所以你现有的经验不会很有帮助。

答案 2 :(得分:1)

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

test :: String
test = "Hi"

但我想你正在尝试做IO。

Learn you a Haskell for the Great Good!