【问题标题】:Syntax Issue Where Clause语法问题 Where 子句
【发布时间】:2014-11-08 01:00:58
【问题描述】:

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

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)

谢谢。

【问题讨论】:

  • 我最好的猜测是你的缩进不匹配。检查您没有混合使用制表符和空格。
  • 我现在看不到问题 - 你有标签吗? - 顺便说一句:我不认为你的 primeFactors 工作正常 - primeFactors 5 会返回 [5,3,2],你永远不会将内部的 xs 更改为与 [] 不同的任何东西,...
  • 问题已解决,谢谢!
  • 我想提醒大家,您可以通过在OP上打开一个编辑窗口来查看是否有标签。尽管在这种情况下并不能准确地确定问题出在哪里 - 缩进在发布时一定会变得更加混乱。通过以制表符或 4 个空格开始每一行来指示 SO 的代码块这一事实对此无济于事。

标签: haskell syntax where


【解决方案1】:

在我的 GHCi v.7.6.3 平台上,这两个编译成功。这不是一个正确的实现,但它是正确的语法。 (你写的基本上是filter isPrime [x,x-1,..0],你也需要过滤x的可分性。你可能还需要重复的素数,你可以通过连续的除法得到;参见divMod运算符,它计算@ 987654324@ 和 mod 在一起。)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多