Tôi đang trong quá trình viết một thư viện vector đồ chơi (vật lý) và đang gặp vấn đề với chức năng nhấn mạnh GHC cần có Integer
s trong loại của chúng. Tôi muốn vectơ để nhân vectơ, cũng như vô hướng (chỉ sử dụng *
), và trong khi điều này là có thể bởi chỉ cần có Vector
dụ Num
Tôi bây giờ nhận lỗi của các loại:Tại sao Haskell suy ra một loại cụ thể (rõ ràng) không nhất quán?
Couldn't match expected type `Integer' with actual type `Double'
Sau khi chơi đùa với các mã để pin xuống vấn đề tôi đã nhận được nó xuống này:
data V a = V a a a deriving (Show, Eq, Functor)
scale a (V i j k) = V (a*i) (a*j) (a*k)
(<.>) = scale
Bây giờ nếu chúng tôi yêu cầu GHCi loại này là chúng tôi nhận được:
>:t scale
scale :: Num a => a -> V a -> V a
>:t (<.>)
(<.>) :: Integer -> V Integer -> V Integer
Nơi chúng tôi chắc chắn không muốn <.>
chỉ hoạt động trên Integer
s. Mặc dù điều này có thể khắc phục được ở đây bằng cách bao gồm chữ ký loại cho <.>
, tôi muốn biết điều gì đang thực sự xảy ra.
có thể trùng lặp của [Hạn chế monomorphism là gì?] (Http://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction) – Bakuriu