我有以下代码
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
函数类型,所以基本上代码不起作用。
我该如何解决?
答案 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