+++
2 つの数学ベクトルを加算する関数が必要です。
ベクトルを次のように実装し[x, y, z]
て使用できます。
(+++) :: (Num a) => [a] -> [a] -> [a]
(+++) = zipWith (+)
したがって、任意のn次元ベクトルに対応します (したがって、これも機能し[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 (+)
もちろん、これはもう少し複雑ですが、他のすべてのベクトル関数を実装すると、それは無関係です (40 行ではなく 50 行)。
リスト アプローチの問題は、2D ベクトルを 3D ベクトルに追加できることです。その場合、zipWith
単純に 3D ベクトルのz
コンポーネントを切り取ります。それは理にかなっているかもしれませんが(2Dベクトルを に拡張する必要がある可能性が高い[x, y, 0]
です)、他の機能については、どちらかが静かに発生すると問題になる可能性があると考えています。タプル アプローチの問題は、ベクトルが 3 つのコンポーネントに制限されることです。
直感的には、ベクトルを として表現する方が理にかなっていると思います。これは(x, y, z)
、数学的ベクトルには固定数のコンポーネントがあり、コンポーネントをベクトルにコンス (先頭に追加) することは実際には意味がないためです。
一方で、3D ベクトル以外のものが必要になる可能性はほとんどありませんが、それに限定するのは適切ではないようです。
私が欲しいのは、同じ長さの 2 つのリストを取る関数か、任意のサイズのタプルを操作する関数だと思います。
実用性、スケーラビリティ、エレガンスなどの点で何か提案はありますか?