试图弄清楚为什么这不会编译?我刚刚发布了类似的问题,关于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)
感谢。
答案 0 :(得分:2)
在GHCi v.7.6.3的平台上,这两个的编译成功了。它不是正确的实现,但它是正确的语法。 (你所写的内容基本上是filter isPrime [x,x-1,..0]
,你也需要通过x
来过滤可分性。你可能还需要重复的素数因子,你可以通过连续的除法得到它们;参见{{ 1}}运算符,它同时计算divMod
和div
。)
您的文本编辑器可能会混合制表符和空格。我最喜欢的文本编辑器之一Kate的一个定制是显示明确的标签和尾随空格;它对此有很大帮助。如果你有选项卡,Haskell中的一个选项卡被定义为与可被8整除的下一列对齐 - 这不是你的约定(你使用2,4和5个空格)。如果它出现在mod
前面,但不在你的警卫面前,那么你就会在Haskell语义中隐藏而不是缩进。