2011-06-14 74 views
0
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按钮,返回结果。Haskell计数示例

似乎没有明白,什么是错的

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

+0

尝试在任何文本编辑器中按ESC,看看什么字符出来...... – delnan 2011-06-14 18:44:51

+0

没什么,以及如果c =='\ ESC'应该是正确的,但其余的代码? – SummerBreak 2011-06-14 18:54:56

+1

正确观察,错误结论。没有字符出现,因为ESC根本不生成任何字符,所以当然它没有生成字符的转义序列。是否有鼠标点击的转义序列?命令行应用程序永远不会看到ESC等等(至少它们不会默认)。 – delnan 2011-06-14 18:58:28

回答

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)来缓解这两种情况。

4

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

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

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

​​
3

你的函数返回类型IO (Int,Int) 现在,让我们看到了3个分支中的if/else

如果部分结果在return (x, y)这是很好的,因为这将返回一个IO(INT,INT)和那你的函数的返回类型是什么

现在在else ifelse部分,结果似乎不符合事实,你的功能暗示返回类型是IO (Int,Int)

else if和else表达式应该导致IO (Int,Int)类型。这只是一个提示。如果您曾经使用其他编程语言(如C#和Java)并尝试编写一个返回字符串的函数,但如果返回字符串部分,则返回int。这将无法正常工作..同样的问题在这里适用