オブジェクトのリストがあるコードに共通のパターンがあり、それらを関数に渡してchoose
ユーザーに選択させます。
choose :: [a] -> (a -> String) -> IO Int
ただし、選択した要素にアクセスするにはパーシャルを使用する必要があるため、 を返すのInt
は残念です。(!!)
これを避けるために、私は
choose :: [a] -> [Lens' [a] a] -> (a -> String) -> IO (Lens' [a] a)
ここで、リストの各要素にアクセスするためのレンズのリストを渡します。そうすれば、実際に存在するかどうかを気にせずに、レンズの反対側にあるオブジェクトを変更しても安全だと確信できます。
このようなレンズのリストを作成するにはどうすればよいですか? 効果的に、私は必要です
makeAccessors :: [a] -> [Lens' [a] a]
おまけとして、より一般的なもの
makeAccessors' :: a -> Traversal' a b -> [Lens' a b]
トラバーサルがアクセスする各ポイントのレンズを作成することも素晴らしいでしょう