あなたはlensesを使用して考えられてきたように、あなたはあなたの例を実装することができ、そのような
modifyMessages :: ([String] -> [String]) -> MyRecord -> MyRecord
modifyMessages = -- Left as an exercise for the student
として、独自の修飾子を書くべきですか?あなたの目的がタプルをプログラマにとって簡単で透明に更新することであるならば、それらは非常にうまくその法案に適合します。
import Data.Label
import Control.Category
import Prelude hiding ((.))
test = ("192.168.1.1", 3455, (1234566, msgs))
msgs = ["aaa", "bbbb", "ccccc"]
append x = modify messages (x :)
main = do
let test' = append "first" test
print test'
print (get messages test')
second2 = lens (\(a,b) -> b) (\b (a,_) -> (a,b))
third3 = lens (\(a,b,c) -> c) (\c (a,b,_) -> (a,b,c))
messages = second2 . third3
second2
とthird3
はあなたが必要とするすべてのタプルに対して一度定義 汎用的な機能のいずれかであることができる、または、彼らはmessages
、またはtimestamp
のような意味のある名前で何か ことができます。以下は、優れたfclabels
パッケージを使用しています。とにかく、この は、一度書かれてからライブラリに隠されたものです。
GHCiの持つテストは望ましい結果が得られます。
ghci> :main
("192.168.1.1",3455,(1234566,["first","aaa","bbbb","ccccc"]))
["first","aaa","bbbb","ccccc"]
はあなたが本当に可変性を求めている、またはあなただけのいくつかの不変データの新しいバージョンを作成するための簡単な方法をしたいですか?前者の場合は、それを再考してください。特に、あなたが可変性を可能にする言語から来た場合。 – delnan
私はいくつかの不変のデータの新しいバージョンを作成する "最小のコストでシンプルな方法を探したい"。 –
"コスト"を定義します。あなたはパフォーマンスについて心配していませんか?もしそうなら、あなたには恥ずかしいです。学習に戻る;) – delnan