Tôi là một chút ngạc nhiên khi mã sau sẽ không biên dịch:Nhân một đúp Complex với cú đúp trong 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
Lỗi nói
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
Vì vậy, trong ngắn hạn
-- Code 2
let z = 1 :+ 2
z * 3 -- Goes fine.
z * 2.5 -- Goes fine.
z * (2.5 :: Double) -- Explodes.
Định nghĩa phức tạp (*) là
instance (RealFloat a) => Num (Complex a) where
(x:+y) * (x':+y') = (x*x'-y*y') :+ (x*y'+y*x')
Tại sao có thể 3 (Num a => a) và 2,5 (Phân số a => a) được so khớp mẫu với (x: + y), nhưng đôi không thể?
Lưu ý rằng việc này không liên quan gì đến việc khớp mẫu. * Hợp nhất * có thể là thuật ngữ đúng. Bạn có thể nói rằng 'Num a => a' là không thể xác định với' Phức tạp đôi', nhưng 'Double' thì không. – Rotsor
Bạn đang làm gì với vận tốc phức tạp? Có vẻ như một giải pháp cho một thứ thực sự là một vectơ. – leftaroundabout
Phức tạp được tích hợp và đi kèm với các chức năng rất tiện dụng để có được pha, độ lớn và tất cả. Tôi không cảm thấy muốn tái phát minh ra bánh xe. Có một thư viện cho các vector 2D tôi có thể sử dụng không? – Niriel