2012-04-12 7 views
7

私はおもちゃ(物理)ベクターライブラリを書く過程にあり、GHCに問題があることを主張しているのは、それらの型がIntegerであるはずです。で遊んで後ハスケルがなぜ特定の型を(矛盾して)推論するのでしょうか?

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

:これが可能であった私は、私は今、ソートのエラーを得ているだけでVectorインスタンスNumを持つことにより、ベクトルがベクトルを乗算したい、だけでなく、(ちょうど*を使用して)スカラー、およびコードは、問題を突き止めるために、私はこれにそれを得ている:

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 

を今、私たちはGHCiのを頼めば、我々は何を得るタイプこれらは、次のとおりです。

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

私たちが確かに望んでいないのは、<.>Integerにしか作用しません。これは<.>のタイプシグネチャを含めることで修正可能ですが、実際に何が起こっているのか知りたいと思います。

+0

可能ですか?[monomorphismの制限とは何ですか?](http://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction) – Bakuriu

答えて

15

あなたは悪名高いに感染しています。別の解決策は、明示的に引数を指定することです:

a <.> v = scale a v 

または-XNoMonomorphismRestrictionプラグマを追加します。

+0

これで閉じる...私はハスケルコンパイラ準備:P。 –

+15

...またはタイプシグネチャを追加してください。とにかく、すべてのトップレベル関数の型シグネチャは良いスタイルとみなされるので、これは単相性制限に関連する問題を避けるための私の好む方法です。 – hammar

関連する問題