所以我是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'上的解析错误"之类的错误。每次我谷歌一些东西并尝试纠正错误时,同样的错误都会重复出现/另一个错误出现。我的错误在哪里?
在 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)
请注意let
和in
如何对齐,以及if
-then
-else
。
如果您使用的是 GHCi,请记住将多行声明放在:{
-:}
中:
λ> :{
λ| smallestCoPrimeOf a
λ| | gcd a b == 1 = b
λ| | otherwise = gcd a (b+1)
λ| :}
您的代码还有其他问题,但这些问题有待您发现。