Num实例的总和元组

mag*_*ras 0 haskell numbers tuples

是否有一种标准的方法来总结Nums的元组?

(1, 2) + (3, 4)
Run Code Online (Sandbox Code Playgroud)

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

似乎这个问题应该定期出现,但我没有在谷歌或搜索结果中看到任何标准解决方案.我错过了什么吗?

lef*_*out 5

使用矢量空间.

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
Run Code Online (Sandbox Code Playgroud)


Naz*_*iuk 5

如果两个元素都是Monoids,则Pair实现Monoid.

对于Num,您可以使用newtype包装器来选择Monoid

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

然后你可以通过uncurrying将这两个数字加在一起<>:

> uncurry (<>) $ (Sum 1, Sum 2) <> (Sum 3, Sum 4)
Sum {getSum = 10}
Run Code Online (Sandbox Code Playgroud)