是否有一种标准的方法来对Num
个元组求和?
(1, 2) + (3, 4)
我认为有很多方法可以实现这一目标。仅举几例:编写自己的函数/运算符,将(Num a, Num b) => (a, b)
设为Num
的实例,将元组包装在newtype
中,等等。
似乎这个问题应该定期出现,但我在Google或SO搜索结果中看不到任何标准解决方案。我想念什么吗?
答案 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}