2012-04-12 33 views
7

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.

+0

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

Trả lời

15

Bạn đang gặp sự cố khét tiếng . Một giải pháp khác là chỉ định đối số một cách rõ ràng:

a <.> v = scale a v 

Hoặc thêm -XNoMonomorphismRestriction pragma.

+0

Vì vậy, đóng ... Nếu chỉ tôi có trình biên dịch Haskell đã sẵn sàng: P. –

+15

... hoặc thêm chữ ký loại. Loại chữ ký trên tất cả các chức năng cấp cao nhất được coi là phong cách tốt anyway, vì vậy đây là cách ưa thích của tôi tránh các vấn đề hạn chế liên quan đến monomorphism. – hammar

Các vấn đề liên quan