语法问题Where子句

时间:2014-11-07 16:33:21

标签: haskell syntax where

试图弄清楚为什么这不会编译?我刚刚发布了类似的问题,关于haskell'其中'语法。

primeFactors :: Int -> [Int]
primeFactors x = genPrimes x []
  where
    genPrimes x xs
      |x == 0 = []
      |isPrime x = x : genPrimes (x - 1) xs
      |otherwise = genPrimes (x - 1) xs

我在输入' |'上收到解析错误

' isPrime'函数在这里定义,并且具有相似的结构和函数,是什么' primeFactors'的语法问题?

isPrime :: Int -> Bool
isPrime a = go a (a - 1)
  where 
     go a b 
      |a == 1 || b == 1 = True
      |a `mod` b == 0 = False
      |otherwise = go a (b - 1)

感谢。

1 个答案:

答案 0 :(得分:2)

在GHCi v.7.6.3的平台上,这两个的编译成功了。它不是正确的实现,但它是正确的语法。 (你所写的内容基本上是filter isPrime [x,x-1,..0],你也需要通过x来过滤可分性。你可能还需要重复的素数因子,你可以通过连续的除法得到它们;参见{{ 1}}运算符,它同时计算divModdiv。)

您的文本编辑器可能会混合制表符和空格。我最喜欢的文本编辑器之一Kate的一个定制是显示明确的标签和尾随空格;它对此有很大帮助。如果你有选项卡,Haskell中的一个选项卡被定义为与可被8整除的下一列对齐 - 这不是你的约定(你使用2,4和5个空格)。如果它出现在mod前面,但不在你的警卫面前,那么你就会在Haskell语义中隐藏而不是缩进。