使用Euclid算法编写一个Haskell程序egcd来确定两个整数的最大公约数
我的节目:
eGCD :: Integer -> Integer -> (Integer, Integer, Integer)
eGCD 0 b = (b, 0, 1)
eGCD a b = let (g, s, t) = eGCD (b 'mod' a) a
in (g, t - (b 'div' a) * s, s)
但是当它在WinGHCI中运行时,它会出错:
Prelude> :load C:\HaskellProject\egcd.hs
C:\HaskellProject\egcd.hs:3:36: error:
? Syntax error on 'mod'
Perhaps you intended to use TemplateHaskell or TemplateHaskellQuotes
? In the Template Haskell quotation 'mod'
[1 of 1] Compiling Main ( C:\HaskellProject\egcd.hs, interpreted )
Failed, modules loaded: none.
答案 0 :(得分:3)
要将函数用作中缀运算符,您需要使用`
而不是'
包围它们:
eGCD :: Integer -> Integer -> (Integer, Integer, Integer)
eGCD 0 b = (b, 0, 1)
eGCD a b = let (g, s, t) = eGCD (b `mod` a) a
in (g, t - (b `div` a) * s, s)
'
用于字符文字。
答案 1 :(得分:3)
@adamse已经回答了语法错误的解决方案:对于中缀运算符,应该使用反引号(`
)而不是单引号('
)。
然而,回归三个整数很奇怪?根据引用的问题,以下程序应该:
eGCD :: Integer -> Integer -> Integer
eGCD 0 b = b
eGCD a b = eGCD (b `mod` a) a
这也允许使用尾递归,这可能会提高程序的性能。
最后,您可以使用Integral
类而不是整数来概括您的程序:
eGCD :: Integral i => i -> i -> i
eGCD 0 b = b
eGCD a b = eGCD (b `mod` a) a
这是有效的,因为0
是Num
(而Integral
是Num
),mod
可以对任何类型的i
进行操作那是Integral
。