Quiero una función +++
que añada dos vectores matemáticos.Haskell: entre una lista y una tupla
pude poner en práctica vectores como [x, y, z]
y uso:
(+++) :: (Num a) => [a] -> [a] -> [a]
(+++) = zipWith (+)
Y así acomodar cualquier vector dimensional n (por lo que esto funcionaría para [x, y]
también).
O podría implementar vectores como (x, y, z)
y uso:
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 (+)
Por supuesto, esto es un poco más complejo, pero cuando implemente todas las demás funciones vectoriales, que es irrelevante (50 líneas en lugar de 40).
El problema con el enfoque de lista es que puedo agregar un vector 2D con un vector 3D. En ese caso, zipWith
simplemente cortaría el componente del vector 3D z
. Si bien eso podría tener sentido (más probablemente debería expandir el vector 2D a [x, y, 0]
), para otras funciones estoy pensando que podría ser problemático que cualquiera de las dos ocurra silenciosamente. El problema con el enfoque de tupla es que limita el vector a 3 componentes.
Intuitivamente, creo que tendría más sentido representar vectores como (x, y, z)
, ya que un vector matemático tiene un número fijo de componentes y realmente no tiene sentido contraer (anteponer) un componente a un vector.
Por otro lado, aunque es muy poco probable que necesite nada más que vectores 3D, no parece del todo correcto limitarlo a eso.
Supongo que lo que quiero son funciones que toman dos listas de la misma longitud, o mejor, funciones que operan en tuplas de tamaño arbitrario.
Cualquier sugerencias, en términos de practicidad, escalabilidad, elegancia, etc.?
http: // stackoverflow.com/questions/7220953/does-haskell-have-variadic-functions-tuples –
Sé que esta pregunta es un poco antigua, pero es posible que desee echar un vistazo al [vector-space] (http: //hackage.haskell paquete .org/paquete/vector-espacio). –