がどのように私はnewtype
に頼らず(a, a)
Functor
を作ることができる(a)のファンクタ?メイキング
基本的に私はそれがこのように仕事をしたい:
instance Functor (a, a) where
fmap f (x, y) = (f x, f y)
しかし、もちろん、それを表現するための法的な方法ではないこと:
Kind mis-match
The first argument of `Functor' should have kind `* -> *',
but `(a, a)' has kind `*'
In the instance declaration for `Functor (a, a)'
私が本当にしたいことのようなタイプレベルの関数でありますこれは\a -> (a, a)
(無効な構文)です。だからタイプエイリアス、おそらく?
type V2 a = (a, a)
instance Functor V2 where
fmap f (x, y) = (f x, f y)
私はこれがうまくいくと思いますが、そうではありません。まず私は、この苦情を取得:
Illegal instance declaration for `Functor V2'
(All instance types must be of the form (T t1 ... tn)
where T is not a synonym.
Use -XTypeSynonymInstances if you want to disable this.)
In the instance declaration for `Functor V2'
私はアドバイスに従うとTypeSynonymInstances
拡張子を追加する場合、私は新しいエラーを取得する:
Type synonym `V2' should have 1 argument, but has been given 0
In the instance declaration for `Functor V2'
、当たり前、それがポイントです! V2
はFunctor
インスタンスに必要な種類の* -> *
を持っています。だけの種類のポイントを破る簡単なタプル、対処することができるというのではなく、私のコード全体V2
の自由を振りかけるする
newtype V2 a = V2 (a, a)
instance Functor V2 where
fmap f (V2 (x, y)) = V2 (f x, f y)
しかし、今、私が持っている:まあ、[OK]を、私はこのようなnewtype
を使用することができますそれをFunctor
にすること。その時点で私は自分自身の機能を作るかもしれませんvmap :: (a -> b) -> (a, a) -> (b, b)
。
のでnewtype
せず、すなわち、うまくこれを行う方法はありますか?
タプルをこのようなFunctorにしたいですか?特別ケースのタプルで操作するためにuber-Functorの権限が必要な場合は、最初にタプルではなくカスタムデータ構造を使用しているはずです。あなたが操作しているタプルは何を表していますか? –
@ダン私は「ユーバー・ファンクタの力」を必要としません。それはちょっと便利だったでしょうし、そうでなければならないと思っていました。 –
@pelotom私は可能であるように思えますが、そうではないようです。私はちょうど私の石鹸ボックスに乗って、タプルのオーバーロードではなく、あなたの問題に合った表現力豊かな構造を作ることを説くために少し時間がかかると思った。 –