我有以下代码
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