Nessuno dei due. C'è già è una notazione perfettamente buona per il prodotto punto di due vettori:
vec1⋅vec2
Perché vuoi inventarne uno nuovo?
Ecco un semplice esempio in Haskell:
a ⋅ b = foldl1 (+) $ zipWith (*) a b
infixl 7 ⋅
main = putStrLn $ show $ [1, 3, -5] ⋅ [4, -2, -1]
-- 3
Ciò dichiara ⋅
di essere un operatore di inflessione di sinistra al livello di precedenza 7, che è la stessa associatività, fissità e precedenza degli altri operatori di moltiplicazione di Haskell. (Anche se, in generale, il prodotto puntino di solito non è associativo, quindi potresti voler renderlo infix 7
invece, per evitare confusione.)
Ecco un altro esempio in Scala:
sealed case class Vector[T](ns: T*)(implicit n: Numeric[T]) {
def ⋅(o: Vector[T]) =
ns zip o.ns map {case (a, b) => n.times(a, b) } reduceLeft (n.plus _)
}
println(Vector(1, 3, -5)⋅Vector(4, -2, -1))
// 3
Purtroppo, Scala non supporta la precedenza o l'associatività definite dall'utente.
E anche in un linguaggio molto restrittivo come Ruby, che sfortunatamente non supporta affatto gli operatori definiti dall'utente, puoi comunque ottenere un risultato abbastanza ragionevole semplicemente usando un semplice vecchio metodo invece di un operatore:
#encoding: UTF-8
class Vector
def initialize(*ns)
@ns = ns
end
def ⋅ o
ns.zip(o.ns).map{|a, b| a*b }.reduce(:+)
end
protected
attr_reader :ns
end
def Vector(*ns)
Vector.new(*ns)
end
puts Vector(1, 3, -5).⋅ Vector(4, -2, -1)
# 3
O in Clojure:
(defn ⋅ [a b] (reduce + (map * a b)))
(println (⋅ [1 3 -5] [4 -2 -1]))
[Nota: l'esempio è ovviamente molto semplicistico, dal momento che usa una semplice lista di numeri per la rappresentazione vettoriale. Ovviamente, in un'implementazione vettoriale real , dovresti utilizzare un tipo di vettore appropriato.]