7

私はおもちゃ(物理)のベクトルライブラリを作成中ですが、GHCで問題が発生しており、関数Integerのタイプにsが含まれている必要があります。ベクトルとスカラー(を使用するだけ)を乗算するベクトルが必要です。これはインスタンスを使用*するだけで可能でしたが、次のようなエラーが発生します。VectorNum

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

問題を特定するためにコードをいじってみた後、私はこれにたどり着きました:

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

<.>確かにsだけに作用したくない場合Integer。これは、の型署名を含めることでここで修正できますが<.>、実際に何が起こっているのか知りたいです。

4

1 に答える 1

15

悪名高い単相制限に遭遇しています。別の解決策は、引数を明示的に指定することです。

a <.> v = scale a v

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

于 2012-04-12T05:46:00.613 に答える