私はKmettのレンズに絶えず深く潜っています。今日私はいくつかのカスタムトラバーサルを作成しようとしています。今までは、既存のトラバーサルを作成して新しいトラバースを作成することに成功しましたが、もう少し複雑な作業をしています。より複雑なトラバーサル(レンズ)を書く
私はテキストエディタを作成しています。複数のカーソルを追加していますが、最初は各バッファに1つのカーソルがあり、フォーカスするレンズがありました。今はカーソルのリストに一般化しています。リスト。トリックは前のケースでは私のレンズがセッター内でいくつかのバリデーションを行い、カーソルがバッファのテキストの有効範囲内に収まるようにしていたということです。
clampCursor :: Text -> Cursor -> Cursor
cursor :: Lens' Buffer Cursor
cursor = lens getter setter
where getter buf = buf^.curs
setter buf new = let txt = buf^.text
in buf & curs .~ clampCursor txt new
バッファーのコンテキストからのテキスト情報を使用してカーソル上にレンズを作成する方法に注意してください。 (誰かが提案をしている場合はカスタムレンズを作る代わりにこれを行うためのクリーンな方法について聞いてみたいと思っています。
これで複数のカーソルが得られました。これをトラバーサルに変換する必要がありますが、もちろんlens getter setter
メソッドを使用してトラバーサルを定義することはできません。トラバーサルを定義する方法を見て、私はこれを読むtutorial;
質問:トラバーサルを作成するにはどうすればよいですか?
回答:
- トラバースは、「あなたはTraversableの
- を実装する任意のタイプのためにすべてのレンズを得るトラバーサルも型チェックしますトラバーサルの通りです:プリミティブのトラバースを作成するには、3つの主な方法があります。また、(このチュートリアルではカバーされていない)トラバーサル」で「すべてのプリズムは、以来、あなたはトラバーサルの使用makePrismsを生成するためのテンプレートHaskellのを使用することができます
- 」
これらの方法のどれも実際にここで助けません。私はアプリケーションスタイルを使ってトラバースを作成するスタイルも見てきましたが、それはいつも私にとっては少し混乱していました。私が望むものを得るためにこのケースでどのように使用するのか本当に分かりません。
私はと書いて、バリデーションを実行するためにセッターのカーソルをマップして、それからそのリストをトラバースすると仮定しますが、トラバース後にトラバーサルにベーキングする方法が必要です何らかの形で単一の要素が集中している)。おそらく、これを完全に行うより良い方法があります。
私はトラバーサルについて学べるほど多くのことを学んでいますので、説明は分かります!ありがとう!
編集: @dfeuerは、この種の検証を行うと無効なレンズになることを指摘しました。レンズ内部で行うためのクリーンなインターフェイスが本当に気に入りました。私が知っている限り、バリデーションは偶発的であるため、実際の問題は発生しないはずですが、これをどうやって改善するかについての提案があります。
あなたはすでに問題のビットを持っている:私たちは
Traversal'
をしたいので、我々は今、私たちのf
にApplicative f
制約を持っていることを除いて、私たちのためのマッピング」、コードが同じである、クランプのおかげで、あなたの「レンズ」は、法を守るレンズではありません。 'Cursor'が何であり、どのように使用されているのかについていくつかの情報を与えることができますか?あなたの現在の設定は私に少し奇妙に感じます。私は、カーソルをバッファの「一部」と考える傾向がありません。あなたが本当に望むかもしれないと思うのは、レンズのようなバッファーのような "ポインタ"のようなものです。 – dfeuerええと、そうだね。インターフェイスがきれいだが法を遵守している場合、検証を行うためのより良い方法がありますか?私はいつもバリデーションをどこで実行すべきかと考えてきました。基本的には、カーソルは、ファイルへのオフセットであり、将来の操作がどこで実行されるべきかを記録する。文字の削除、テキストの挿入などが含まれます。この場合の「バッファ」は、編集可能なテキストの表現のVimの用語を指します。私の場合、各バッファにはカーソルがあります。 私はレンズのようなポインタを使ってすべてをやってみたいですが、それをしようとすると他のレンズの法則が壊れます:P –
カーソルが設定されているときにカーソルのリストをさらに変換したいと思います。例えば、私はそれらを並べ替え、重複を削除したいと思います。 –