2012-04-12 12 views
7

Bir oyuncak (fizik) vektör kütüphanesi yazma sürecindeyim ve GHC ısrarcı fonksiyonlarla ilgili sorunlarımın türünde Integer s olması gerekir. Ben vektörler (sadece * kullanarak) vektörleri, hem de skalarlar çarpmak istiyorum, ve bu süre sadece ben şimdi tür hatalar alıyorum Vector örneği Num alarak mümkündü:Neden Haskell belirli bir tip (görünüşe göre) tutarsız bir şekilde sonuçlandı?

Couldn't match expected type `Integer' with actual type `Double' 

ile uğraşırken sonra kod sorunu tespit etmek için bu kadar aşağı ele verdik:

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 

Şimdi GHCi sorarsanız aldığımız ne tür bunlar:

>:t scale 
scale :: Num a => a -> V a -> V a 
>:t (<.>) 
(<.>) :: Integer -> V Integer -> V Integer 

<.>'u kesinlikle istemiyoruz, sadece Integer s. Bu, <.> için bir tür imza ekleyerek burada düzeltilebilir olsa da, aslında neler olduğunu bilmek isterim.

+0

[Monomorfizm kısıtlaması nedir?] Olası kopyası (http://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction) – Bakuriu

cevap

15

Kötüye kullanılan koşuyorsunuz. Başka bir çözüm açıkça argüman belirtmek olacaktır:

a <.> v = scale a v 

Ya -XNoMonomorphismRestriction pragma ekleyin.

+0

Çok yakın ... Sadece bir Haskell derleyicisi olsaydı hazır: P. –

+15

... veya bir tür imzası ekleyin. Tüm üst düzey işlevler için imzalar, zaten iyi bir stil olarak kabul edilir, bu yüzden bu, monomorfizm kısıtlama ile ilgili sorunlardan kaçınmanın tercih edilen yoludur. – hammar

İlgili konular