将所有haskell数组值与其gcd分开

时间:2017-02-27 16:33:53

标签: haskell

我有以下代码

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函数类型,所以基本上代码不起作用。

我该如何解决?

2 个答案:

答案 0 :(得分:3)

多个号码的GCD:

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

然后您可以使用它来划分数组中的所有数字:

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

答案 1 :(得分:1)

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

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

完成后,您可以找到列表中的GCD,然后通过GCD 划分每个号码。

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