İki matematik vektörü ekleyen bir işlev +++
istiyorum. herhangi n boyutlu vektör (yani bu çok [x, y]
için çalışacak) karşılamak böyleceHaskell: Bir liste ve tuple arasında
(+++) :: (Num a) => [a] -> [a] -> [a]
(+++) = zipWith (+)
Ve:
Ben [x, y, z]
ve kullanımı gibi vektörleri uygulayabilir.
Veya (x, y, z)
ve kullanım gibi vektörleri uygulamak: Elbette
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 (+)
bu biraz daha karmaşıktır, ancak tüm diğer vektör işlevleri yerine zaman, bu önemsizdir (yerine 40 50 satırlar).
Liste yaklaşımı ile ilgili sorun, 3B vektörü bir 3B vektörü ile ekleyebileceğimdir. Bu durumda, zipWith
, 3B vektörlerinin z
bileşenini basitçe keser. Bu mantıklı olsa da (daha büyük olasılıkla 2B vektörünü [x, y, 0]
'a genişletmelidir), diğer işlevler için sessizce gerçekleşmesi sorunlu olabileceğini düşünüyorum. Tuple yaklaşımındaki problem, vektörü 3 bileşenle sınırlandırmasıdır.
Sezgisel, bunun matematiksel vektör bileşenlerinin sabit sayıda olduğundan, (x, y, z)
olarak vektörleri temsil etmek daha mantıklı olacağını düşünürdüm ve gerçekten eksileri mantıklı (başa getirebilir) bir vektör bir bileşen yapmaz.
Diğer yandan, 3 boyutlu vektörlerden başka bir şeye ihtiyacım olamayacak kadar olası olmamasına rağmen, bunu bununla sınırlamak oldukça doğru görünmemektedir.
İstediğim şey, eşit uzunluktaki tuple'larda çalışan eşit uzunluktaki iki veya daha iyi işlevleri içeren işlevlerdir.
önerileri, pratiklik, ölçeklenebilirlik, zarafet, vb?
{-# LANGUAGE FlexibleInstances #-} -- needed to make tuples type class instances
class Additive v where
(+++) :: v -> v -> v
instance (Num a) => Additive (a,a) where
(x,y) +++ (ξ,υ) = (x+ξ, y+υ)
instance (Num a) => Additive (a,a,a) where
(x,y,z) +++ (ξ,υ,ζ) = (x+ξ, y+υ, z+ζ)
...
Bu şekilde, eklenebilir değişken uzunlukta dizilerini ama derleme sırasında sağlanacaktır:
http: // stackoverflow.com/questions/7220953/does-haskell-have-variadic-functions-tuples –
Bu sorunun biraz eski olduğunu biliyorum, ancak [vektör-uzayı] 'na bir göz atmak isteyebilirsiniz (http: //hackage.haskell .org/paket/vektör-alan) paketi. –