私は幾何学ライブラリをhaskellにまとめています。私はそれをリリースするつもりはない、それは私が言語の知識を向上させるために使用している単なるプロジェクトです。タイプクリスタルとGADT
Iは次のように定義
data Local a where
MkLocal :: (Vectorise a) => ReferenceFrame -> a -> Local a
参照フレームがフレームの原点とフレームの回転を表す角度を指すベクトル、定義WRT「絶対の両方であると、Local
データ型を持っています"参照のフレーム(ねえ、それは現実の世界ではありません!)。 Vectorise
ジオメトリは、Vector
のリストへの可逆変換を有するものである。
次のようにローカルがFunctor
のインスタンスであることができることを私に発生しました:
instance Functor Local where
fmap f geom = localise (frame geom) (f $ local geom)
コンパイラは定義におけるローカライズの使用のためのVectorisableのインスタンスがないと文句を言い。無限のGHC拡張の1つを使用してこの制限を回避する方法はありますか?
EDIT:コメントで要求されたように、ここでのタイプのいくつかは、エラーがfmap
の型が(a -> b) -> f a -> f b
あるので、理にかなって
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'
ある
local :: Local a -> a
frame :: Local a -> ReferenceFrame
localise :: (Vectorise a) => ReferenceFrame -> a -> Local a
を使用しています。それはa
がVectorise
のインスタンスでなければならないと推測することができますが、b
が(何らかの形で)指定できないと、f
は別の型定義を定義することなく制限付き戻り値を持たなければならないことがわかりますすでにのがすでに請求書に適合しているものです(または、この方法でクラスを制限すると、何らかの理由で型推論が破られる理由を説明できる人がいれば助かります)。
ps。私も、私はlocal
とframe
がfmap
「localise」、「local」、「frame」の種類とエラーメッセージを表示してください。私の推測では、 'Local'の'インスタンスVectorise'が欠落しています。 –
完了。私はインスタンス宣言を追加しようとしましたが、それは役に立たなかった。 '' Local a''ではなく、 '' Vectorise''として宣言する必要があるのは 'f'の戻り型です。 – ovangle