Haskellでジオメトリライブラリをまとめています。リリースするつもりはありません。言語の知識を向上させるために使用しているプロジェクトにすぎません。
Local
次の定義を持つデータ型があります
data Local a where
MkLocal :: (Vectorise a) => ReferenceFrame -> a -> Local a
参照フレームは、フレームの原点を指すベクトルであり、フレームの回転を表す角度であり、どちらも「絶対」参照フレームに対して定義されます (ねえ、それは現実世界ではありません!)。ジオメトリは、のVectorise
リストへの可逆変換を持つものですVector
。
Local はFunctor
次のようなインスタンスになる可能性があることに気づきました。
instance Functor Local where
fmap f geom = localise (frame geom) (f $ local geom)
しかし、コンパイラは、定義で localize を使用するための Vectorisable のインスタンスがないと文句を言います。無数のGHC拡張機能の1つを使用して、この制限を回避する方法はありますか?
編集:コメントで要求されているように、使用されているタイプの一部を次に示します
local :: Local a -> a
frame :: Local a -> ReferenceFrame
localise :: (Vectorise a) => ReferenceFrame -> a -> Local a
エラーは
No instance for (Vectorise b)
arising from a use of `localise'
In the expression:
localise (frame geom) (f $ local geom)
In an equation for `fmap':
fmap f lgeom = localise (frame geom) (f $ local geom))
In the instance declaration for `Functor Local'
fmap
の型が であるため、これは理にかなっています(a -> b) -> f a -> f b
。a
のインスタンスである必要があると推測できますが、(どういうわけか) 指定できない限り、別の型クラスを定義せずに制限された戻り値の型を持たなければならないことをコンパイラーに伝えるVectorise
ことができるかどうかをどのように推測できるか疑問に思っていました。ほぼすでに法案に適合しています(または、この方法でクラスを制限すると型の推論が何らかの形で壊れる理由を誰かが有益に説明できれば)。b
f
ps。私はまた、定義で反転して反転local
したタイプミスを修正しましたframe
fmap