将所有Haskell数组值与其GCD分开



我有以下代码

reducer :: Row El -> Row El
reducer r = let getGCD l = map (x y -> gcd x y) l
                gcd' = getGCD r
                f = (x -> map (y -> y * gcd') x)
             in (f (r))

为了将数组与其gcd分开。

reducer [8,8,12] :: Row Int
-- > [2,2,3]

但我无法设法适合reducer :: Row El -> Row El函数类型,因此基本上代码不起作用。

我该如何修复?

多个数字的GCD:

gcd' = foldl gcd 0 :: (Integral b, Foldable t) => t b -> b

您可以使用该数组中的所有数字:

div' xs = map (`div` g) xs
  where
    g = gcd' xs

必须计算出3个或多个数字的GCD,以所有所有数字考虑。最简单的方法是递归计算列表尾部的GCD,然后计算该值和头部的GCD。由于gcd x 0 == x对于任何X,我们可以将基本情况定义为0。(Haskell的实现gcd也定义了gcd 0 0 == 0。)

getGCD [] = 0
getGCD (x:rest) = gcd x (getGCD rest)

一旦有了,您就可以找到列表的GCD,然后divide 每个数字由GCD。

reducer r = let gcd' = getGCD r
            in map (x -> div x gcd') r

最新更新