Haskell euclid算法是两个整数的最大公约数

时间:2017-01-21 12:27:40

标签: haskell

  

使用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.

2 个答案:

答案 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

这是有效的,因为0Num(而IntegralNum),mod可以对任何类型的i进行操作那是Integral