Num个实例的总元组

时间:2018-09-05 14:27:25

标签: haskell numbers tuples

是否有一种标准的方法来对Num个元组求和?

(1, 2) + (3, 4)

我认为有很多方法可以实现这一目标。仅举几例:编写自己的函数/运算符,将(Num a, Num b) => (a, b)设为Num的实例,将元组包装在newtype中,等等。

似乎这个问题应该定期出现,但我在Google或SO搜索结果中看不到任何标准解决方案。我想念什么吗?

2 个答案:

答案 0 :(得分:5)

使用vector-space

Prelude> :m +Data.VectorSpace
Prelude Data.VectorSpace> (1,2) ^+^ (3,4)
(4,6)
Prelude Data.VectorSpace> (1,2,5) ^+^ (3,4,6)
(4,6,11)
Prelude Data.VectorSpace> ((1,2),(9,8)) ^+^ ((3,4),(6,7))
((4,6),(15,15))
Prelude Data.VectorSpace> ((1,2),(9,8)) ^+^ ((3,4),0)  -- dimension mismatch

<interactive>:5:1: error:
    • No instance for (Num (Integer, Integer))
        arising from a use of ‘it’
    • In the first argument of ‘print’, namely ‘it’
      In a stmt of an interactive GHCi command: print it

答案 1 :(得分:5)

如果两个元素都是Monoid,Pair将实现Monoid。

对于Num,您可以使用新型包装器选择Monoid

> :m +Data.Monoid
> (Sum 1, Sum 2) <> (Sum 3, Sum 4)
(Sum {getSum = 4},Sum {getSum = 6})

然后您可以通过不费吹灰之力<>将两个数字加在一起:

> uncurry (<>) $ (Sum 1, Sum 2) <> (Sum 3, Sum 4)
Sum {getSum = 10}