Haskell-定义在';其中';

Haskell-定义在';其中';,haskell,where-clause,parse-error,Haskell,Where Clause,Parse Error,我刚开始自学哈斯克尔。此代码应该执行素因子分解: divides :: Integer -> Integer -> Bool divides small big = (big `mod` small == 0) lowestDivisor :: Integer -> Integer lowestDivisor n = lowestDivisorHelper 2 n where lowestDivisorHelper m n | (m `divides`

我刚开始自学哈斯克尔。此代码应该执行素因子分解:

divides :: Integer -> Integer -> Bool
divides small big = (big `mod` small == 0)

lowestDivisor :: Integer -> Integer
lowestDivisor n = lowestDivisorHelper 2 n
    where lowestDivisorHelper m n
        | (m `divides` n) = m  -- these should belong to lowestDivisorHelper
        | otherwise = lowestDivisorHelper (m+1) n

primeFactors :: Integer -> [Integer]
primeFactors 1 = []
primeFactors n
    | n < 1 = error "Must be positive"
    | otherwise = let m = lowestDivisor n
                  in m:primeFactors (n/m)
divides::Integer->Integer->Bool
除以小的大的=(大的'mod'small==0)
最小除数::整数->整数
lowestDivisor n=lowestDivisor辅助对象2 n
其中最低除数m n
|(m`divides`n)=m--它们应该属于最低的除数帮助器
|否则=最低除数帮助器(m+1)n
primeFactors::Integer->[Integer]
素数因子1=[]
素数因子
|n<1=错误“必须为正”
|否则=设m=最小除数n
以m为单位:基本因子(n/m)
我在注释行上得到一个解析错误。我想我的问题可能是
lowestdivisiorhelper
有防护,但编译器不知道防护是属于
lowestdivisiorhelper
还是
lowestdivisior
。我该怎么做


我应该补充一点,我不想为了隐藏实现细节而在顶层定义helper函数。导入文件时不应使用helper函数

lowestDivisor :: Integer -> Integer
lowestDivisor n = lowestDivisorHelper 2 n where 
  lowestDivisorHelper m n
        | (m `divides` n) = m  -- these should belong to lowestDivisorHelper
        | otherwise = lowestDivisorHelper (m+1) n
您需要使用helper函数启动一个新语句,以便通过比较使防护装置充分缩进。 (您还忘记了一个参数,
n
) 这也将有助于:

lowestDivisor :: Integer -> Integer
lowestDivisor n = lowestDivisorHelper 2 n 
    where 
  lowestDivisorHelper m n
        | (m `divides` n) = m  -- these should belong to lowestDivisorHelper
        | otherwise = lowestDivisorHelper (m+1) n
但这并不是:

lowestDivisor :: Integer -> Integer
lowestDivisor n = lowestDivisorHelper 2 n 
  where lowestDivisorHelper m n
        | (m `divides` n) = m  -- these should belong to lowestDivisorHelper
        | otherwise = lowestDivisorHelper (m+1) n
关键是
|
必须比函数名更靠右


一般来说,开始一条新线路时,只要它更靠右,就会继续上一条线路。警卫必须继续从函数名开始。

啊,我刚刚写了一条评论,说你的上一个例子很好。“导入文件不应该带着helper函数。”在这种情况下,不要导出它。