[解決済み] 機能性レンズ
2023-06-15 17:50:21
質問
どなたか機能性レンズについて解説していただけませんか?ググっても意外と難しいテーマで、全然進みません。私が知っているのは、OOと同様のget/set機能を提供するということだけです。
どのように解決するのですか?
レンズはゲッターとセッターの2つの関数で構成されています。
data Lens a b = Lens { getter :: a -> b, setter :: b -> a -> a }
例えば、ペアの1番目と2番目のパーツ用のレンズがあるとします。
fstLens :: Lens (a, b) a
fstLens = Lens fst $ \x (a, b) -> (x, b)
sndLens :: Lens (a, b) b
sndLens = Lens snd $ \x (a, b) -> (a, x)
レンズの本当の便利さは、構図を決めることです。
compose :: Lens b c -> Lens a b -> Lens a c
compose f g = Lens (getter f . getter g) $
\c a -> setter g (setter f c (getter g a)) a
と機械的に変換され
State
に遷移します。
lensGet :: MonadState s m => Lens s a -> m a
lensGet = gets . getter
lensSet :: MonadState s m => Lens s b -> b -> m ()
lensSet f = modify . setter f
lensMod :: MonadState s m => Lens s b -> (b -> b) -> m ()
lensMod f g = modify $ setter f =<< g . getter f
(+=) :: (MonadState s m, Num b) => Lens s b -> b -> m ()
f += x = lensMod f (+ x)
関連
-
[解決済み] (関数型)リアクティブプログラミングとは?
-
[解決済み] Hindley-Milnerのどの部分が理解できないのでしょうか?
-
[解決済み] Project Eulerとの速度比較。CとPythonとErlangとHaskellの比較
-
[解決済み] 関数型プログラミングで時間関数が存在するのはなぜですか?
-
[解決済み] フリーモナドとは何ですか?
-
[解決済み】関数型プログラミングはGoFデザインパターンに取って代わるか?
-
[解決済み】代数的なデータ型の代数を悪用する - なぜこれが有効なのか?
-
[解決済み】ミュータブルステートなしで何か役に立つことができるのか?
-
[解決済み] Haskellの初心者向けガイド?[終了しました]
-
[解決済み] 型チェッカーは非常に間違った型置換を許可しているが、プログラムはまだコンパイルできる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 機能における非網羅的なパターン【重複あり
-
[解決済み] .の違いは何ですか?(ドット)と$(ドルマーク)の違いは何ですか?
-
[解決済み] Haskellで大規模設計?[クローズド]
-
[解決済み] ghciで関数を複数行に渡って定義するには?
-
[解決済み] lenses, fclabels, data-accessor - 構造体アクセスと突然変異のためのどのライブラリが良いか
-
[解決済み] なぜ遅延評価が有効なのか?
-
[解決済み] 関数型プログラミングを実世界で使うには?[クローズド]
-
[解決済み] fixの使い方、効果について教えてください。
-
[解決済み] MonadPlus, Alternative, Monoidの型別は?
-
[解決済み] GHCiで関数の型宣言を明示的に行うには?