ファンクターを使用してクラス関数から派生する一般化されたニュータイプ

クリントン

キー/値のマッピングを表すクラスを開発していて、基本的に次のような関数がありますalterF

class C t where
  ...
  alterF :: Functor f => 
    (Maybe (Value t) -> f (Maybe (Value t))) -> Key t -> t -> f t

残念ながら、これは壊れGeneralisedNewtypeDerivingます。場合によっては、これは合理的です。GeneralisedNewtypeDeriving私が理解していることから本質的にCoercibleと関数を使用しているからcoerceです。Coercible表現的に等しいタイプを表します。つまり、実行時に同じ表現を持つため、無料で変換できます。たとえば、次のようになります。

newtype T a = T a

我々は持っています:

Coercible a (T a)
Coercible (T a) a

しかし、私たちは(一般的に)持っていません:

Coercible (f a) (f (T a))
Coercible (f (T a)) (f a)

たとえば、GADTはこの表現の平等に違反します。しかし、fそれが機能するという価値観はたくさんあります例えば:

Coercible (Maybe a) (Maybe (T a))
Coercible (Maybe (T a)) (Maybe a)
Coercible [a] [T a]
Coercible [T a] [a]
Coercible (Identity a) (Identity (T a))
Coercible (Identity (T a)) (Identity a)

このインスタンスは次のように記述できることも私には思い浮かびます。

Functor f => Coercible (f a) (f (T a))
Functor f => Coercible (f (T a)) (f a)

を使用するだけfmapです。通常とは異なりcoerce、これは実行時に無料ではありませんが、機能します。

したがって、10個の関数を持つクラスがあり、そのうち9個はで正常に機能しGeneralisedNewtypeDerivingます。を使用して機械的に解決できる、そうでない最後の1つだけがありfmapます。すべてのクラス関数のカスタムラッピング/アンラッピング実装を作成する必要がありますか、それとも問題のある関数のみの実装を作成するように要求する方法、またはGHCをfmapその一部として使用するように誘導する方法はありGeneralisedNewtypeDerivingますか?

ルキ

場合fFunctor、あなたはそれのために、「表現ラッパー」を作ることができます

data Rep f a where
    Rep :: (b -> a) -> f b -> Rep f a

これはf、で表象的であること除いて同型でありa、名目上の分散に対する本質的に存在記号であるf可能性があります。この構造にはたまたま派手な圏論の名前があると思いますが、それが何であるかは覚えていません。からf a戻るにはRep f afFunctorフードを使用する必要があります

このラッパーをメソッドで使用して、クラスが表現的に変化するようにすることができます。

alterFRep :: (Functor f) 
          => (Maybe (Value t) -> Rep f (Maybe (Value t))) -> Key t -> t -> Rep f t

そして、との同型写像を使用して、実際の「メソッド」を通常の関数にしRep fます。インスタンス作成者にとって便利な方法を作成することもできます。

toAlterFRep :: 
    (forall f t. (Functor f) => (Maybe (Value t) -> f (Maybe (Value t))) -> Key t -> t -> f t)
 -> (forall f t. (Functor f) => (Maybe (Value t) -> Rep f (Maybe (Value t))) -> Key t -> t -> Rep f t)

そのため、一体何であるかを心配する必要はありません通常どおりにRep実装alterFして使用toAlterFRepするだけです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ファイル関数を一般化して、パラメーターで指定された数のテキストファイルを開くにはどうすればよいですか?

分類Dev

特殊なテンプレート関数で一般化されたテンプレートクラスを使用する

分類Dev

GOlangで空のインターフェイスを使用して同時マップ関数を一般化する

分類Dev

可変個引数テンプレートを使用して一般化された関数ラッパーを作成する方法

分類Dev

さまざまなパラメーターと値に対して、次のコマンドを自動化して一般化する方法(bashスクリプトで使用する場合)はどうすればよいですか?

分類Dev

一般化された方法で、udevを使用して永続的なインターフェース名を割り当てる

分類Dev

一般化されたニュータイプの導出

分類Dev

Sysprepを使用して(マスターではなく)クローンを一般化できますか?

分類Dev

一般的に型指定されたインターフェイスを使用して、一般的にクラスを入力します

分類Dev

一般化された型制約を含むクラスでのパターンマッチング

分類Dev

一般化された型制約を含むクラスでのパターンマッチング

分類Dev

インターフェイスまたはクラスを使用して、一般的なUIイベントを1か所にグループ化するにはどうすればよいですか?

分類Dev

Keras / Tensorflowでトレーニング可能な一般化されたバンプ関数レイヤーを実装する

分類Dev

一般化されたzip関数の左側はタイプチェックを行いません

分類Dev

ディレクトリとファイルを区別する一般化された chmod 関数 (つまり、find を使用)

分類Dev

メソッドパラメータを一般化できない場合、インターフェース/コントラクトが必要ですか?

分類Dev

さまざまなタイプの関数にRustマクロを一般化するにはどうすればよいですか?

分類Dev

一般化された文字列をテキストファイルから削除する

分類Dev

継承されたファクトリメソッドからJSクラスタイプを一般的にインスタンス化することは可能ですか?

分類Dev

一般化された関数との関連で抽象パラメータを持つ特殊な関数

分類Dev

適切なシーケンスから(一般化された)シーケンスを導出する

分類Dev

テンプレート化されていないインターフェースから「一般的な」データを取得する

分類Dev

パッケージ「nVennR」を使用してデータを変換し、一般化された準比例ベン図を作成する

分類Dev

RecyclerView / ListViewにSQLiteから一般化されたデータを入力します

分類Dev

タイプパラメーターを持つファクトリメソッドを使用して、パラメーター化されたコンストラクターで派生クラスを作成します

分類Dev

整数を一般化するPurescriptタイプクラスはありますか?

分類Dev

一般的な関数ポインタをテンプレートパラメータとして使用するにはどうすればよいですか?

分類Dev

C# のジェネリックスを使用してデータをフェッチおよび更新する方法を一般化する

分類Dev

一般化されたクラス図のテーブルを作成するには?

Related 関連記事

  1. 1

    ファイル関数を一般化して、パラメーターで指定された数のテキストファイルを開くにはどうすればよいですか?

  2. 2

    特殊なテンプレート関数で一般化されたテンプレートクラスを使用する

  3. 3

    GOlangで空のインターフェイスを使用して同時マップ関数を一般化する

  4. 4

    可変個引数テンプレートを使用して一般化された関数ラッパーを作成する方法

  5. 5

    さまざまなパラメーターと値に対して、次のコマンドを自動化して一般化する方法(bashスクリプトで使用する場合)はどうすればよいですか?

  6. 6

    一般化された方法で、udevを使用して永続的なインターフェース名を割り当てる

  7. 7

    一般化されたニュータイプの導出

  8. 8

    Sysprepを使用して(マスターではなく)クローンを一般化できますか?

  9. 9

    一般的に型指定されたインターフェイスを使用して、一般的にクラスを入力します

  10. 10

    一般化された型制約を含むクラスでのパターンマッチング

  11. 11

    一般化された型制約を含むクラスでのパターンマッチング

  12. 12

    インターフェイスまたはクラスを使用して、一般的なUIイベントを1か所にグループ化するにはどうすればよいですか?

  13. 13

    Keras / Tensorflowでトレーニング可能な一般化されたバンプ関数レイヤーを実装する

  14. 14

    一般化されたzip関数の左側はタイプチェックを行いません

  15. 15

    ディレクトリとファイルを区別する一般化された chmod 関数 (つまり、find を使用)

  16. 16

    メソッドパラメータを一般化できない場合、インターフェース/コントラクトが必要ですか?

  17. 17

    さまざまなタイプの関数にRustマクロを一般化するにはどうすればよいですか?

  18. 18

    一般化された文字列をテキストファイルから削除する

  19. 19

    継承されたファクトリメソッドからJSクラスタイプを一般的にインスタンス化することは可能ですか?

  20. 20

    一般化された関数との関連で抽象パラメータを持つ特殊な関数

  21. 21

    適切なシーケンスから(一般化された)シーケンスを導出する

  22. 22

    テンプレート化されていないインターフェースから「一般的な」データを取得する

  23. 23

    パッケージ「nVennR」を使用してデータを変換し、一般化された準比例ベン図を作成する

  24. 24

    RecyclerView / ListViewにSQLiteから一般化されたデータを入力します

  25. 25

    タイプパラメーターを持つファクトリメソッドを使用して、パラメーター化されたコンストラクターで派生クラスを作成します

  26. 26

    整数を一般化するPurescriptタイプクラスはありますか?

  27. 27

    一般的な関数ポインタをテンプレートパラメータとして使用するにはどうすればよいですか?

  28. 28

    C# のジェネリックスを使用してデータをフェッチおよび更新する方法を一般化する

  29. 29

    一般化されたクラス図のテーブルを作成するには?

ホットタグ

アーカイブ