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按钮,返回结果。
似乎不明白,出了什么问题
是的,我必须使用这个签名答案 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) y
和x (y+1)
是什么意思?我猜你正试图增加x和y,但是haskell不会那样工作。
相反,尝试让emptyAndOther
获取x和y的当前值,然后通过调用emptyAndOther (x+1) y
或emptyAndOther x (y+1)
来递归这两种情况。
答案 2 :(得分:3)
您的函数的返回类型为IO (Int,Int)
现在让我们看看if / else
如果part得到return (x, y)
这是好的,因为这将返回IO(Int,Int),那就是你的函数返回类型
现在在else if
和else
部分,结果似乎并不意味着您的函数返回类型为IO (Int,Int)
。
else if和else表达式都应该导致IO (Int,Int)
类型。这只是一个提示。如果您使用过其他编程语言(如C#和Java)并尝试编写一个返回字符串的函数,但是如果部分返回字符串,则在其他部分返回int。那不行。相同的问题在这里适用