だから私は同形を扱いたいだけで、手を使うことができます。
私はテキスト エディターを作成しています。タスクに応じて、(行、列) のタプルとして、またはテキスト オブジェクトへの単一の整数オフセットとして、カーソルの位置を 2 つの異なる方法で考えたいと思います。
私はレンズを使用して全体を構築しているので、これは ISO について学ぶのに適した場所のように思えました。
もともと私はBuffer
オブジェクトを持っていました:
data Buffer = Buffer {
_text :: T.Text
, _cursor :: Int
} deriving (Show, Eq)
makeLenses ''Buffer
しかし、カーソルが (row, col) タプルになる可能性があるので、次のように変更しました。
data Buffer c = Buffer {
_text :: T.Text
, _cursor :: c
} deriving (Show, Eq)
makeLenses ''Buffer
Buffer Int
バッファのコンテキスト内では to からto への同形Buffer (Int, Int)
があるので (この制約は、変換を行うためにテキストとオフセットが必要なためです)、バッファを使用するすべての関数に、 「ただ働く」。
現在、定義でポリモーフィックにする方法にこだわっています。
できます:
appendText :: T.Text -> Buffer c -> Buffer c
しかし、もちろん、カーソルは完全に型指定されていないため、実際にはまったく使用できません。
私が見つけることができた大まかに関連するライブラリは、このtype-isoライブラリだけで、あまり人気がないようです。ブログの投稿が見つからなかったという考えで、これが人々のすることなのかどうか疑問に思いますか?
これが良いライブラリである場合、 Isomorphic のインスタンスを作成する必要があると考えており、 Injectiveの各インスタンスを作成すると無料で取得できるようですが、ドキュメントや例が見つかりませんすぐに理解できるので、これが慣用的な方法であるかどうかを確認したかったのです。これが正しければ、Isomorphic 制約または Injective 制約のどちらを使用しますか?
編集:少しいじりましたが、実際にInjectiveを実装してIsoを無料で入手できるようですが、このライブラリは人気がないようですので、慣用的なアプローチを探しています。
最後に、レンズ isos の場合、次のように記述する必要があります。
toRowColumn :: Iso' (Buffer Offset) (Buffer (Int, Int))
toRowColumn = iso to to
toOffset :: Iso' (Buffer (Int, Int)) (Buffer Offset)
toOffset = iso to to
または、より良い/より簡単な方法はありますか? これらは私のインスタンスから派生できますか?
良いレンズ同形の例やチュートリアルを知っている人はいますか? Google はあまり役に立ちません :/
助けてくれてありがとう!私が慣用的にすべてを行っていることを確認するためにチェックインしたいだけです。