我想要一个函数+++
,它添加了两个数学向量。Haskell:列表和元组之间
我可以实现向量作为[x, y, z]
及用途:
(+++) :: (Num a) => [a] -> [a] -> [a]
(+++) = zipWith (+)
并由此适应任何ň维向量(所以这会为[x, y]
工作太)。
或者我可以实现向量作为(x, y, z)
和使用:
type Triple a = (a, a, a)
merge :: (a -> b -> c) -> Triple a -> Triple b -> Triple c
merge f (a, b, c) (x, y, z) = (f a x, f b y, f c z)
(+++) :: (Num a) => Triple a -> Triple a -> Triple a
(+++) = merge (+)
当然,这是稍微更复杂,但是它,当我实现所有的其它载体功能,即不相关(50行而不是40)。
列表方法的问题是我可以添加一个2D矢量与3D矢量。在这种情况下,zipWith
将简单地切掉3D矢量的z
组件。虽然这可能是有道理的(更可能它应该将2D矢量扩展到[x, y, 0]
),但对于其他功能,我认为可能会有问题发生,无论是默默发生。元组方法的问题是它将矢量限制为3个组件。因为数学矢量具有固定数量的分量,所以将一个分量用于向量(前置)是没有意义的。直观上,我认为将向量表示为(x, y, z)
会更有意义。另一方面,虽然我不太需要3D矢量以外的其他任何东西,但将其限制在这个范围似乎不太合适。
我想我想要的是采用两个相等长度或更好的函数对任意大小的元组进行操作的函数。
任何建议,在实用性,可扩展性,优雅等方面?
http:// stackoverflow。com/questions/7220953/does-haskell-have-variadic-functions-tuples –
我知道这个问题有点旧,但你可能想看看[vector-space](http://hackage.haskell .org/package/vector-space)包。 –