yo estaba un poco sorprendido cuando el siguiente código no se compilará:multiplicar un complejo doble con un doble en Haskell
-- Code 1
import Complex
type Velocity = Complex Double
type Force = Complex Double
type FrictionCoeff = Double
frictionForce :: FrictionCoeff -> Velocity -> Force
frictionForce mu vel = mu * vel
dice El error
Couldn't match expected type `Complex Double'
with actual type `Double'
Expected type: Force
Actual type: FrictionCoeff
In the first argument of `(*)', namely `mu'
In the expression: mu * vel
Así que, en resumen
-- Code 2
let z = 1 :+ 2
z * 3 -- Goes fine.
z * 2.5 -- Goes fine.
z * (2.5 :: Double) -- Explodes.
Complex define (*) como
instance (RealFloat a) => Num (Complex a) where
(x:+y) * (x':+y') = (x*x'-y*y') :+ (x*y'+y*x')
¿Por qué 3 (Num a => a) y 2.5 (Fraccional a => a) se comparan con patrones (x: + y), pero un doble no?
Tenga en cuenta que esto no tiene nada que ver con la coincidencia de patrones. * Unificación * puede ser el término correcto. Puedes decir que 'Num a => a' es unificable con' Complex Double', pero 'Double' no lo es. – Rotsor
¿Qué estás haciendo con velocidades complejas de todos modos? Parece una solución para algo que realmente debería ser un vector. – leftaroundabout
Complejo están incorporados y vienen con funciones muy prácticas para obtener la fase, la magnitud y todo. No tengo ganas de reinventar la rueda. ¿Hay una biblioteca para vectores 2D que pueda usar? – Niriel