在haskell代码中解析错误

时间:2017-05-10 06:23:05

标签: haskell recursion

我的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.

无法解释我哪里出错了,在我看来更像是一个逻辑错误。我的代码想要打印给定分子和分母的商。请帮助我的错误是什么。提前谢谢。

1 个答案:

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

这正是它的含义:如果numden,则0den的商为0;如果num - den >= 0,那么它比num - denden的商数多一个;否则它是0