私はおもちゃ(物理)のベクトルライブラリを作成中ですが、GHCで問題が発生しており、関数Integer
のタイプにsが含まれている必要があります。ベクトルとスカラー(を使用するだけ)を乗算するベクトルが必要です。これはインスタンスを使用*
するだけで可能でしたが、次のようなエラーが発生します。Vector
Num
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
。これは、の型署名を含めることでここで修正できますが<.>
、実際に何が起こっているのか知りたいです。