【问题标题】:Constant errors in the method for smallest coprime number最小互质数方法中的恒定误差
【发布时间】:2019-10-11 10:53:51
【问题描述】:

所以我是 Haskell 的新手,我一直在尝试实现找到最小互质数的函数。我还有另一个计算 GCD 的函数。

我已经尝试了各种方法来实现我的功能,但是都失败了。

smallestCoPrimeOf :: Int -> Int
smallestCoPrimeOf a 
| gcd a b == 1  =  b
| otherwise     = gcd a (b+1)

或将最后两行替换为

b = 2

if (gcd a b) == 1 

then b 

else gcd a (b+1)

let b = 2

if (gcd a b) == 1  then b else gcd a (b+1)

所有这些最终都会引发错误,例如“输入'|'上的解析错误”或“输入'if'上的解析错误”。每次我用谷歌搜索某些东西并尝试纠正错误时,都会重复相同的错误/出现另一个错误。我的错在哪里?

【问题讨论】:

  • 您是在 GHCi 中运行它还是在文件中编写它?请记住,Haskell 源代码和 GHCi 的工作方式不同。
  • 我不确定您的 ifs 是如何格式化的,因为看起来格式在问题中丢失了(您可以将 edit 重新输入),但那些 | 行需要缩进到“内部”smallestCoPrimeOf。所以在每个之前放置一个或多个空格。这将导致您出现更相关的非解析错误:)
  • 我已经尝试过解析,它仍然会抛出相同的错误。是的,我正在把它写在一个文件中。
  • 如何将图片粘贴到某处以便更清晰?
  • 不要粘贴图片。所以政策反对它。如果需要,请复制并粘贴错误 text:大多数文本界面都允许您这样做。更多关于这里的问题:要解决这个任务,如果你定义一个(递归)函数smallestCoPrimeOfFrom a b,它会找到第一个互质数>=b。一旦你这样做了,你就可以拥有smallestCoPrimeOf a = smallestCoPrimeOfFrom a 2 并完成你的任务。

标签: haskell


【解决方案1】:

在 Haskell 中,缩进很重要。您必须缩进这些行以显示哪些行从属于其他行。这就是让 Haskell 避免像其他语言一样使用这么多括号的原因。像这样:

smallestCoPrimeOf :: Int -> Int
smallestCoPrimeOf a 
    | gcd a b == 1  =  b
    | otherwise     = gcd a (b+1)

缩进量不限,只要一致即可。

你也可以写:

smallestCoPrimeOf :: Int -> Int
smallestCoPrimeOf a =
    let b = 2
    in if (gcd a b) == 1
       then b
       else gcd a (b+1)

注意letin 以及if-then-else 是如何对齐的。

如果您使用 GHCi,请记住在 :{-:} 中放入多行声明:

λ> :{
λ| smallestCoPrimeOf a 
λ|   | gcd a b == 1  =  b
λ|   | otherwise     = gcd a (b+1)
λ| :}

您的代码还有其他问题,但这些有待您发现。

【讨论】:

  • 所以我用 | gcd a b == 1 = b 其中 b = 2 |否则 = gcd a (b+1),带有适当的衬里,它仍然显示“输入‘|’时出现解析错误”。这也是与缩进相关的问题吗?
  • 至于 let b = 2 in if (gcd a b) == 1 then b else gcd a (b+1) 它说“输入'let'时解析错误”,而谷歌没有'也无济于事。
  • @LifeIsShit 我用正确的语法编辑了他给出的第二个示例(它在第 2 行中缺少 =
猜你喜欢
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多