byłem nieco zaskoczony, gdy następujący kod nie kompilacji:Mnożąc kompleksu Pokój z podwójnym w 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
Błąd mówi
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
Tak więc, w krótkim
-- Code 2
let z = 1 :+ 2
z * 3 -- Goes fine.
z * 2.5 -- Goes fine.
z * (2.5 :: Double) -- Explodes.
Kompleks definiuje (*) jako
instance (RealFloat a) => Num (Complex a) where
(x:+y) * (x':+y') = (x*x'-y*y') :+ (x*y'+y*x')
Dlaczego 3 (Num a => a) i 2,5 (Ułamkowo a = a) można dopasować do wzoru (x: + y), ale Podwójne nie?
Należy pamiętać, że nie ma to nic wspólnego z dopasowywaniem wzorców. * Ujednolicenie * może być właściwym terminem. Możesz powiedzieć, że 'Num a => a' jest zunifikowane z' Complex Double', ale 'Double' nie jest. – Rotsor
Co robisz ze złożonymi prędkościami? Wygląda jak obejście czegoś, co naprawdę powinno być wektorem. – leftaroundabout
Complex są wbudowane i mają bardzo przydatne funkcje, aby uzyskać fazę, wielkość i wszystko. Nie mam ochoty na nowo wynajdować koła. Czy istnieje biblioteka dla wektorów 2D, z których mogłabym korzystać? – Niriel