哈斯克尔计数的例子

时间:2011-06-14 18:41:00

标签: haskell

emptyAndOther
    :: IO (Int, Int)
emptyAndOther =
   do
     c <- getChar
     if c == '\ESC'
              then return (x, y)
     else if isSpace c
              then (x+1) y
     else x (y+1)
  where
     x = 0
     y = 0

这段代码有什么问题? 我想计算每一个空行和每个字符和ESC按钮,返回结果。

似乎不明白,出了什么问题

是的,我必须使用这个签名

3 个答案:

答案 0 :(得分:4)

问题在于你的else分支试图将x作为一个函数调用,这是一件很奇怪的事情,因为它是一个数字而已。我建议尝试编写辅助函数

emptyAndOther' :: Int -> Int -> IO (Int, Int)

这样emptyAndOther = emptyAndOther' 0 0。对于未来,我会指出仔细阅读错误消息有很大帮助。例如,GHC的错误消息几乎就是我所做的(尽管用更简洁的语言):

The function `x + 1' is applied to one argument,
but its type `Int' has none
In the expression: (x + 1) y

答案 1 :(得分:3)

这是一个回答的问题。在代码中:

 else if isSpace c
          then (x+1) y
 else x (y+1)

表达式(x+1) yx (y+1)是什么意思?我猜你正试图增加x和y,但是haskell不会那样工作。

相反,尝试让emptyAndOther获取x和y的当前值,然后通过调用emptyAndOther (x+1) yemptyAndOther x (y+1)来递归这两种情况。

答案 2 :(得分:3)

您的函数的返回类型为IO (Int,Int) 现在让我们看看if / else

中的3个分支

如果part得到return (x, y)这是好的,因为这将返回IO(Int,Int),那就是你的函数返回类型

现在在else ifelse部分,结果似乎并不意味着您的函数返回类型为IO (Int,Int)

else if和else表达式都应该导致IO (Int,Int)类型。这只是一个提示。如果您使用过其他编程语言(如C#和Java)并尝试编写一个返回字符串的函数,但是如果部分返回字符串,则在其他部分返回int。那不行。相同的问题在这里适用