我的haskell代码如下:
module Lain where
let value = 0
divideBy ::(Ord a, Num a)=>a -> a -> a
divideBy _ 0 = 0
divideBy num den
| (num - den) >= 0 = do
value = value + 1
return divideBy (num-den) den
| otherwise = value
加载haskell Lain.hs文件时出错:
app/Lain.hs:18:1: error:
parse error (possibly incorrect indentation or mismatched brackets)
Failed, modules loaded: none.
无法解释我哪里出错了,在我看来更像是一个逻辑错误。我的代码想要打印给定分子和分母的商。请帮助我的错误是什么。提前谢谢。
答案 0 :(得分:1)
value = value + 1
不是do
块中的有效语句。唯一有效的陈述是:
变量绑定:let pattern = expression
monadic binding:pattern <- expression
评估为monadic动作的表达式
但是,您不需要do
块,因为您不需要使用monadic副作用来实现此功能。此外,return
与命令式语言中的return
不同 - 它不是从当前函数返回的关键字,而是创建返回值的操作的函数。看起来你value = value + 1
的意图是改变value
,但Haskell中没有可变变量。 (有可变引用类型,例如IORef
,但您在这里不需要它们。)
因此,一种解决方案是简单地使用表达式:
divideBy :: (Ord a, Num a) => a -> a -> a
divideBy _ 0 = 0
divideBy num den
| num - den >= 0 = 1 + divideBy (num - den) den
| otherwise = 0
这正是它的含义:如果num
为den
,则0
和den
的商为0
;如果num - den >= 0
,那么它比num - den
和den
的商数多一个;否则它是0
。