【问题标题】:How can I fix this function如何修复此功能
【发布时间】:2019-10-20 02:19:41
【问题描述】:

我一直在使用 Haskell 完成一项学校作业,并且一遍又一遍地遇到相同的解析错误。我一直在网上寻找并没有解决我的问题。任何建议将不胜感激。这是函数...

maxGaussNorm :: [GaussianInt] -> GaussianInt
maxGaussNorm [] = (0,0)
maxGaussNorm gs = maxAux (tail gs) (head gs)

maxAux :: [GaussianInt] -> GaussianInt -> GaussianInt
maxAux gs m 
      | gs == [] = m
      | (gaussNorm (head gs)) <= (gaussNorm m) = maxAux (tail gs) m
      | (gaussNorm (head gs)) > (gaussNorm m) = maxAux (tail gs) (head gs)

Try it online!

【问题讨论】:

  • 什么你遇到了解析错误? GaussianInt 是如何定义的?
  • GaussianInt 被定义为类型 GaussianInt = (Integer,Integer),我不断得到的错误是 Assign_2.hs:90:18: error: parse error on input `=' 也许你需要一个'让'在'做'块?例如'让 x = 5' 而不是 'x = 5' | 90 | gs == [] = 米 | ^
  • 这是整个文件吗?这部分代码没有给出解析错误。 Try it online!
  • @JestynStrik 不,标签也应该可以正常工作,您只需要避免将它们与可能导致不明显错误的空格混合在一起,所以这只是我对正确外观代码的第一次猜测。正如 Potato44 所说,请发帖minimal reproducible example
  • 你之前评论中的错误信息说它发生在第 90 行。你能把第 90 行的内容连同它两边的几行上下文一起发布吗?

标签: haskell parse-error


【解决方案1】:

您在链接中发布的代码与您在问题正文中发布的代码不同。

这是您的代码实际上存在解析错误

maxGaussNorm :: [GaussianInt] -> GaussianInt
maxGaussNorm gs = compareMax (tail gs) (head gs)
    compareMax :: [GaussianInt] -> GaussianInt -> GaussianInt
    compareMax gs m
        gs == [] = m
        gaussNorm(head gs) <= gaussNorm m = compareMax (tail gs) m
        gaussNorm(head gs) > gaussNorm m = compareMax (tail gs) (head gs)

这有两个问题,缺少守卫上的管道字符|, 而您忘记在 compareMax 的定义之前包含 where 关键字。

这是修复了这些解析错误的代码

maxGaussNorm :: [GaussianInt] -> GaussianInt
maxGaussNorm gs = compareMax (tail gs) (head gs)
  where
    compareMax :: [GaussianInt] -> GaussianInt -> GaussianInt
    compareMax gs m
       | gs == [] = m
       | gaussNorm(head gs) <= gaussNorm m = compareMax (tail gs) m
       | gaussNorm(head gs) > gaussNorm m = compareMax (tail gs) (head gs)

您最初与问题一起发布的代码也是通过将辅助函数重写为顶级函数并在警卫上包含管道来解决解析错误的方法

maxGaussNorm :: [GaussianInt] -> GaussianInt
maxGaussNorm [] = (0,0)
maxGaussNorm gs = maxAux (tail gs) (head gs)

maxAux :: [GaussianInt] -> GaussianInt -> GaussianInt
maxAux gs m 
      | gs == [] = m
      | (gaussNorm (head gs)) <= (gaussNorm m) = maxAux (tail gs) m
      | (gaussNorm (head gs)) > (gaussNorm m) = maxAux (tail gs) (head gs)

这个实现也略有不同,它处理空列表而不是错误。

【讨论】:

    猜你喜欢
    • 2019-09-15
    • 1970-01-01
    • 2013-05-19
    • 2020-02-26
    • 1970-01-01
    • 2016-01-12
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多