ã‚ã¾ã‚ŠçŸ¥ã‚‰ã‚Œã¦ã„ãªã„関数型言語ã®ãŠã‚‚ã—ã‚概念ã¨ã—ã¦ã€Opticsã¨ã„ã†ã‚‚ã®ãŒã‚る。
Opticsã¨ã¯ã€ã‚ªãƒ–ジェクト指å‘言語ã§è¨€ã†ã¨ã“ã‚ã®Setter/Getterを一種ã®é–¢æ•°ã¨ã—ã¦æ‰ãˆã€ã„ãã¤ã‹ã®ä¾¿åˆ©ãªç‰¹æ€§ã‚’付与ã—ãŸã‚‚ã®ã®ç·ç§°ã 。ã“ã®ä¾¿åˆ©ãªç‰¹æ€§ã«ã‚ˆã£ã¦ã€Setter/Getter以上ã®ã“ã¨ã‚’パワフルã«ã“ãªã›ã‚‹ã€‚
最も有åãªOpticsã¯Lensã§ã‚ã‚Šã€è‰²ã€…ãªè§£èª¬è³‡æ–™ãŒ(主ã«Haskellå‘ã‘ã«)出ã¦ã„る。
ã•ã¦ã€ã“ã‚Œã¾ã§ã®Opticsを紹介ã™ã‚‹è³‡æ–™ã¯Setterã¨Getterã¨ã—ã¦ã®å´é¢ã«æ³¨ç›®ã—ãŒã¡ã ã£ãŸã®ã§ã€ã˜ã‚ƒã‚Opticsã®ä½•ãŒè‰¯ã„ã®ã‹ã€Scalaã§ã‚„ã‚‹æ„義ã¯ä½•ã‹ã€ã¨ã„ã†å´é¢ã‚’ã“ã®è¨˜äº‹ã§ç´¹ä»‹ã—よã†ã¨æ€ã†ã€‚
- Optics -- vs. copyメソッド地ç„
- Opticsã¯åˆæˆå¯èƒ½ã§ã‚ã‚‹
- Opticsã¯ãƒœãƒˆãƒ アップã®ã‚¢ãƒ—ãƒãƒ¼ãƒã§ã‚ã‚‹
- OpticsãŒã†ã¾ãã„ãã¨ãã€ã†ã¾ãã„ã‹ãªã„ã¨ã
- ã‚ã‚ã›ã¦èªã¿ãŸã„
- メモ
Optics -- vs. copyメソッド地ç„
OpticsãŒä½•ãªã®ã‹å½¢å¼çš„ã«çŸ¥ã‚‹ã‚ˆã‚Šã‚‚ã€Opticsã§ä½•ãŒã§ãã‚‹ã®ã‹ã‚’ã¾ãšèª¬æ˜Žã—ãŸã»ã†ãŒè‰¯ã„ã ã‚ã†ã€‚四角四é¢ãªèª¬æ˜Žã‚’排ã—ã¦ã–ã£ãã°ã‚‰ã‚“ã«è¡¨ç¾ã™ã‚‹ãªã‚‰ã°ã€Opticsã¨ã¯JSONã‚„ãƒã‚¹ãƒˆã—ãŸã‚¯ãƒ©ã‚¹ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã®ãƒ‘ス的ãªæ¦‚念を独立ã—ã¦å–出ã—ã€åž‹å®‰å…¨ã«ã—ã¦ä¾¿åˆ©ã«ã—ãŸã‚‚ã®ã 。例ãˆã°circe-optics
ã¨ã„ã†ãƒ©ã‚¤ãƒ–ラリを使ã£ã¦ã€ä»¥ä¸‹ã®ã‚ˆã†ãªè¡¨ç¾ã§JSONã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’å–出ã›ã‚‹:
val items: List[Int] = root.order.items.each.quantity.int.getAll(json)
一見動的言語ã®ã‚ˆã†ã ãŒã€Scalaã®ã‚³ãƒ¼ãƒ‰ãªã®ã§åž‹ãŒä»˜ã„ã¦ã„ã‚‹*1。root
ãŒJSONã®é ‚点を表ç¾ã—ã¦ã„ã¦ã€ãã“ã‹ã‚‰ã©ã®ã‚ˆã†ã«ãƒ‘スãŒä¼¸ã³ã¦ã„ãã‹ã‚’æ•™ãˆã€æœ€çµ‚çš„ã«getAll
ã«å‡¦ç†å¯¾è±¡ã¨ãªã‚‹JSONを渡ã™ã“ã¨ã§ãƒ‡ãƒ¼ã‚¿ãŒå¾—られる。JSONã«å¯¾ã—ã¦ç›´æŽ¥å‡¦ç†ã‚’åŠ ãˆã¦ã„ãã®ã§ã¯ãªãã€ã¾ãšãƒ‘スを作ã£ã¦ã‹ã‚‰JSONを渡ã™ã®ãŒç‰¹å¾´çš„ã 。
ã“ã‚Œã ã‘ã ã¨ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’èªã¿å–ã£ã¦ã„ã‚‹ã ã‘ãªã®ã§ãã‚“ãªã«é¢ç™½ããªã„。最åˆã‹ã‚‰åž‹ãŒä»˜ã„ã¦ã„ã‚Œã°getFoo()
ã¿ãŸã„ãªã‚²ãƒƒã‚¿ãƒ¼ã‚’呼ã¹ã°ã„ã„ã ã‘ã ã‹ã‚‰ã 。ãれを独立ã—ã¦æ‰±ã£ã¦ä½•ãŒé¢ç™½ã„ã®ã‹ï¼Ÿ
ã»ã‚“ã¨ã†ã«é¢ç™½ã„ã®ã¯ã€åŒæ§˜ã®æ›¸ã味ã§ãƒ‡ãƒ¼ã‚¿ã®æ›¸ãæ›ãˆ(イミュータブルãªã®ã§å¿…è¦ã«å¿œã˜ã¦ãƒ‡ãƒ¼ã‚¿ãŒè¤‡è£½ã•ã‚Œã‚‹)ã‚‚å¯èƒ½ãªã¨ã“ã‚。
val doubleQuantities: Json => Json = root.order.items.each.quantity.int.modify(_ * 2) val modifiedJson = doubleQuantities(json)
ã“ã‚Œã§ç‰¹å®šã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ãŒ2å€ã•ã‚ŒãŸJSONãŒå¾—られる。
ã“ã‚Œã‚’ç´ ã®case class
ã§æ›¸ã“ã†ã¨æ€ã£ãŸã‚‰ã¾ãšå„レイヤーã”ã¨ã®case class
を定義ã—ãªã‘ã‚Œã°ãªã‚‰ãªã„ã—ã€copy
メソッド地ç„ã«ãªã‚‹ã§ã‚ã‚ã†ã“ã¨ã¯å®¹æ˜“ã«æƒ³åƒãŒã¤ã。Opticsã¯ã€ã€Œã¾ãšãƒ‘スを組ã¿ç«‹ã¦ã€å‡ºæ¥ä¸ŠãŒã£ãŸãƒ‘スã«å®Ÿéš›ã®ãƒ‡ãƒ¼ã‚¿ã‚’入れã¦å‡¦ç†ã™ã‚‹ã€ã¨ã„ã†é †åºã‚’徹底ã—ã¦ã„ã‚‹ã®ã§ã€copy
地ç„ã‚’ã†ã¾ã回é¿ã—ã¦ã„る。copy
ã¯Opticsã®å†…部ã§å‹æ‰‹ã«è¡Œãªã‚ã‚Œã€é©åˆ‡ã«å‡¦ç†ã•ã‚Œã¦ã„る。
関数型言語ã«ãŠã‘る定番ã®æŠ€å·§ã¨ã—ã¦ã€ã€Œå®£è¨€ã¨å®Ÿè¡Œã‚’分離ã™ã‚‹ã€ã¨ã„ã†ã‚‚ã®ãŒã‚る。Opticsã®ç™ºæƒ³ã‚‚ãã®ä¾‹ã«æ¼ã‚Œãšã€ãƒ‘スã®å®šç¾©ã¨ãã®å®Ÿè¡Œã‚’分離ã—ã¦ã„る。似ãŸã‚ˆã†ãªç™ºæƒ³ã¯Freeモナドãªã©ã«ã‚‚出ç¾ã™ã‚‹ã€‚
Opticsã¯åˆæˆå¯èƒ½ã§ã‚ã‚‹
Opticsã®ã†ã‚Œã—ã„特性ã®ä¸€ã¤ã«ã€åˆæˆå¯èƒ½ã§ã‚ã‚‹ã¨ã„ã†ã‚‚ã®ãŒã‚ã‚‹*2。例ãˆã°ã€ã€Œfoo
フィールドをå–出ã™ã€ã¨ã„ã†Lensã¨ã€ã€Œbar
フィールドをå–出ã™ã€ã¨ã„ã†Lensã¨ã‚’組ã¿åˆã‚ã›ã¦ã€ã€Œfoo
フィールドã®ä¸ã®bar
フィールドをå–出ã™ã€ã¨ã„ã†LensãŒå¸¸ã«å¾—られる。ã“ã®ã‚ˆã†ãªåˆæˆã¯ä»–ã®Opticsã«å¯¾ã—ã¦ã‚‚定義ã•ã‚Œã¦ã„る。ã„ãã¤ã‹ä¾‹ã‚’挙ã’よã†:
- Setter/Getterã®æŠ½è±¡åŒ–ã§ã‚ã‚‹
Lens
åŒå£«ã‚’åˆæˆã™ã‚‹- ãƒã‚¹ãƒˆã—ãŸãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«å¯¾ã—ã¦set/getã§ãるよã†ã«ãªã‚‹ã€‚
- å–出ã—ã«å¤±æ•—ã™ã‚‹ã‹ã‚‚ã—ã‚Œãªã„Opticsã§ã‚ã‚‹
Optional
åŒå£«ã‚’åˆæˆã™ã‚‹Option
åŒå£«ã®åˆæˆã®ã‚ˆã†ã«æŒ¯ã‚‹èˆžã†ã€‚フィールドå–出ã—ãŒã§ããªã‘ã‚Œã°å¾Œç¶šã®Opticsã¯å‘¼ã°ãšã«None
ã‚’è¿”ã™ã ã‘
- é…列ã®å„è¦ç´ を表ç¾ã™ã‚‹Opticsã§ã‚ã‚‹
Traversal
ã¨Lens
åŒå£«ã‚’åˆæˆã™ã‚‹- é…列ã®å„è¦ç´ ã®ã‚ªãƒ–ジェクトã«ç”Ÿãˆã¦ã„る特定ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’一気ã«å–出ã—ãŸã‚Šæ›¸ãæ›ãˆãŸã‚Šã§ãã‚‹
ã“れらã®éžå¸¸ã«å„ªã‚ŒãŸåˆæˆãƒ¡ã‚«ãƒ‹ã‚ºãƒ (ãŸã„ã¦ã„ã®OpticsåŒå£«ã¯åˆæˆå¯èƒ½)ãŒã€Opticsã‚’ã„ã£ãã†ä¾¿åˆ©ã«ã—ã¦ã„る。例ãˆã°ã€ã€Œfoo
フィールドã«å…¥ã£ã¦ã„ã‚‹é…列ã®å„オブジェクトã«ã¤ã„ã¦ã€bar
フィールドãŒã‚‚ã—ã‚ã‚Œã°2å€ã›ã‚ˆã€ã¨ã„ã†å‡¦ç†ã‚’ワンライナーã§æ›¸ã下ã›ã‚‹ãƒ¡ã‚«ãƒ‹ã‚ºãƒ ã‚’æä¾›ã§ãã‚‹ã®ã¯Opticsãらã„ã 。ã—ã‹ã‚‚データ全体ã«åž‹ã‚’付ã‘ã‚‹å¿…è¦ãŒç„¡ã„ãŸã‚ã€å‹•çš„型付ã‘言語ã®ã‚ˆã†ã«å°å›žã‚ŠãŒåŠ¹ã。ã¾ãŸã€Opticsã¯JSONé™å®šã®ãƒ¡ã‚«ãƒ‹ã‚ºãƒ ã§ã¯ãªãã€getã¨setã®ã‚ˆã†ãªåŒæ–¹å‘ã®ãƒ‡ãƒ¼ã‚¿ãƒ•ãƒãƒ¼ãŒã‚るよã†ãªãƒ‡ãƒ¼ã‚¿æ§‹é€ ã§ã‚ã‚Œã°ä½•ã«ã§ã‚‚*3実装ã§ãる。
Opticsã¯ãƒœãƒˆãƒ アップã®ã‚¢ãƒ—ãƒãƒ¼ãƒã§ã‚ã‚‹
Opticsã¯å¾¹åº•ã—ã¦ã€Œãƒ‡ãƒ¼ã‚¿ã«ã©ã†ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã‹ã€ã®ã¿ã‚’æ°—ã«ã—ã¦ã„ã‚‹ã“ã¨ã«ãŠæ°—付ãã ã‚ã†ã‹ã€‚実際ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ãŒå…¨ä½“ã¨ã—ã¦ã©ã†ãªã£ã¦ã„ã‚‹ã‹ã¯Opticsã«ã¨ã£ã¦ã¯ã©ã†ã§ã‚‚良ã„ã“ã¨ã§ã€ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã¯ãƒ‘スã®æ§‹ç¯‰ã«ã‚ˆã£ã¦é–“接的ã«èªã¿å–れるã ã‘ã 。ã§ã‚‚ãã‚Œã§ã†ã¾ãã„ã。
我々ãŒã‚ˆãã‚„ã‚‹ã€Scalaã§case class
を定義ã™ã‚‹ã‚ˆã†ãªã€ãƒ‡ãƒ¼ã‚¿ã«åž‹ã‚’付ã‘るアプãƒãƒ¼ãƒã¯ãƒˆãƒƒãƒ—ダウン的ã 。ã—ã‹ã—複雑ã«ãƒã‚¹ãƒˆã—ãŸå¤§è¦æ¨¡ãªãƒ‡ãƒ¼ã‚¿ã€ä¾‹ãˆã°å·¨å¤§JSONãªã©ã§åŒã˜ã‚¢ãƒ—ãƒãƒ¼ãƒã‚’採るã¨ã†ã‚“ã–ã‚Šã™ã‚‹ã‚ˆã†ãªãƒœã‚¤ãƒ©ãƒ¼ãƒ—レートを書ãã“ã¨ã«ãªã‚‹ã€‚Scalaを使ã£ã¦ã©ã“ã‹ã®APIã«ã‚¢ã‚¯ã‚»ã‚¹ã—よã†ã¨ã—ã¦ã†ã‚“ã–ã‚Šã—ãŸäººã¯è‘—者ã ã‘ã§ã¯ãªã„ã ã‚ã†ã€‚
Haskellã§å°ã•ã„シェルスクリプト書ã“ã†ã¨ã—ãŸã‚‰åž‹ãŒã‚ã£ã¦é¢å€’ã ã£ãŸã®ã§ã€ãã®çµŒé¨“ã¯ç„¡é§„ã«ã—ãªã„よã†å¿µé ã«ç½®ã„ã¦ã‚‹
— â¿»ã‚ã„や⿻数å¦ã®å…¥é–€æ›¸ã‚’書ã„ã¦ã„ã¾ã™ï¼ (@public_ai000ya) 2023å¹´6月5æ—¥
ä»–æ–¹ã§Opticsã¯ãƒœãƒˆãƒ アップã®ã‚¢ãƒ—ãƒãƒ¼ãƒã‚’採る。ã‚るフィールドã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ–¹æ³•ã€é…列ã®è¦ç´ ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ–¹æ³•ã€ãれを書ãæ›ãˆã‚‹æ–¹æ³•ã¨ã„ã£ãŸãƒŸãƒ‹ãƒžãƒ«ã‹ã¤åž‹å®‰å…¨ã«æŒ¯ã‚‹èˆžã†éƒ¨å“ã‚’ã€åˆæˆå¯èƒ½ãªå½¢ã§æä¾›ã™ã‚‹ã®ã 。全体ã¨ã—ã¦ã®åž‹ã«ã¯ä¸€åˆ‡é–¢çŸ¥ã—ãªã„。「データ全体ã«åž‹ã‚’付ã‘ã‚‹ã®ãŒå¤§å¤‰ãªã‚‰ã€ãれを辿るãŸã‚ã®ãƒ‘スã«åž‹ã‚’付ã‘ã‚Œã°ã„ã„ã˜ã‚ƒãªã„ã€ã¨ã„ã†ã‚ã‘。
- JSONã«åž‹ã‚’付ã‘ãŸã„
- ãªã‚“ã§ï¼Ÿâ†’型安全ã«ãƒ‡ãƒ¼ã‚¿ã‚’å–り出ã—ãŸã„ã‹ã‚‰
- ãªãœåž‹ãŒä»˜ãã¨å®‰å…¨ã«ãƒ‡ãƒ¼ã‚¿ã‚’å–り出ã›ã‚‹ã®ã‹ï¼Ÿâ†’データãŒãã“ã«ã‚ã‚‹ã“ã¨ã‚’ä¿è¨¼ã§ãã‚‹ã‹ã‚‰ã€‚実行時ã«ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ãªã„ã‹ã‚‰
- ã§ã¯å®Ÿéš›ã«å¿…è¦ãªãƒ‡ãƒ¼ã‚¿ã«ã ã‘注目ã™ã‚Œã°ã‚ˆã„。必è¦ãªãƒ‡ãƒ¼ã‚¿ã«åž‹å®‰å…¨ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã‚Œã°ã‚ˆã„
例ã¨ã—ã¦ã€ã‚るデータã«å«ã¾ã‚Œã‚‹ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰(ãƒã‚¹ãƒˆã—ã¦ã„ã¦æ·±ã„å ´æ‰€ã«ã‚ã‚‹)ã®æ›¸ãæ›ãˆã«ã¤ã„ã¦è€ƒãˆã¦ã¿ã‚ˆã†ã€‚
case class
を使ã£ãŸãƒˆãƒƒãƒ—ダウンã®ã‚¢ãƒ—ãƒãƒ¼ãƒ:- å„フィールドã«å¯¾å¿œã™ã‚‹
case class
を定義ã™ã‚‹ copy
メソッドをãƒã‚¹ãƒˆã•ã›ã¦æ·±ã„フィールドを変更ã™ã‚‹
- å„フィールドã«å¯¾å¿œã™ã‚‹
- Opticsを使ã£ãŸãƒœãƒˆãƒ アップã®ã‚¢ãƒ—ãƒãƒ¼ãƒ:
- å„フィールドã«ã‚¢ã‚¯ã‚»ã‚¹ï¼ˆæ›¸ãæ›ãˆï¼‰ã™ã‚‹ãŸã‚ã®
Lens
を定義ã™ã‚‹ - å„
Lens
ã‚’åˆæˆã—ã¦æ·±ã„フィールドを変更ã™ã‚‹ãŸã‚ã®Lens
を作る - ãれをé©ç”¨ã—ã¦å€¤ã‚’書ãæ›ãˆã‚‹
- å„フィールドã«ã‚¢ã‚¯ã‚»ã‚¹ï¼ˆæ›¸ãæ›ãˆï¼‰ã™ã‚‹ãŸã‚ã®
case class
ã¯ãƒ‡ãƒ¼ã‚¿æ§‹é€ を上ã‹ã‚‰è¦†ã„å°½ãã™ã‚ˆã†ã«åž‹ã‚’付ã‘ã‚‹ã“ã¨ã§åž‹å®‰å…¨ã«ãƒ‡ãƒ¼ã‚¿ã«åˆ°é”ã—よã†ã¨ã™ã‚‹ã®ã«å¯¾ã—ã¦ã€Opticsã¯ãƒ—リミティブãªéƒ¨å“を使ã£ã¦åž‹å®‰å…¨ã«ãƒ‡ãƒ¼ã‚¿ã«åˆ°é”ã—よã†ã¨ã™ã‚‹ã€‚ã“ã‚Œã¯ã€å›³å½¢ã®ç·šã¨ç‚¹ã‚’入れ替ãˆãŸã‚ˆã†ãªé¢ç™½ã•ãŒã‚る。
「ã¾ãšãƒ‡ãƒ¼ã‚¿ã‚’表ç¾ã™ã‚‹åž‹ã‚’付ã‘ã¦ã‹ã‚‰æ‰±ã†ã€ã¨ã„ã†ãŠä½œæ³•ã¯ã€å¿…然ã§ã¯ãªã„ã®ã 。
OpticsãŒã†ã¾ãã„ãã¨ãã€ã†ã¾ãã„ã‹ãªã„ã¨ã
Opticsを使ã£ãŸã‚¢ãƒ—ãƒãƒ¼ãƒãŒæœ‰åŠ¹ãªã®ã¯ã€å¤§è¦æ¨¡ãªãƒ‡ãƒ¼ã‚¿æ§‹é€ ã€ã¾ãŸã¯æ·±ããƒã‚¹ãƒˆã—ãŸãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚„ã€ã‚ã‚‹ã‹ã‚‚ã—ã‚Œãªã„ã—ç„¡ã„ã‹ã‚‚ã—ã‚Œãªã„フィールドã€é…列ã¨ã„ã£ãŸå¾®å¦™ã«æ³¨æ„ãŒå¿…è¦ãªãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ãŒé‡ãªã‚Šã‚ã£ã¦ã„るよã†ãªãƒ‡ãƒ¼ã‚¿æ§‹é€ ã 。ã—ã‹ã—ãªãŒã‚‰Optics自体ã¯ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã®ãƒ‘スã§ã—ã‹ãªã„ãŸã‚ã€æ˜Žã«ãƒ‡ãƒ¼ã‚¿æ§‹é€ ãŒã©ã®ã‚ˆã†ãªå½¢ã‚’ã—ã¦ã„ã‚‹ã‹ã‚’示ã™ã“ã¨ãŒã§ããªã„。Opticsã¯ã‚ãã¾ã§ã€å°ã•ãªéƒ¨å“を組ã¿åˆã‚ã›ã¦æŸ”軟性を生ã¿å‡ºã™ãƒœãƒˆãƒ アップã®ã‚¢ãƒ—ãƒãƒ¼ãƒã 。
Opticsを使ã£ãŸã‚¢ãƒ—ãƒãƒ¼ãƒãŒã‚ã¾ã‚Šã†ã¾ãã„ã‹ãªã„ã®ã¯ã€æµ…ãã¦ç°¡å˜ãªcase class
ã§è¡¨ç¾ã§ãるよã†ãªãƒ‡ãƒ¼ã‚¿æ§‹é€ ã‚’æ“作ã™ã‚‹ã‚ˆã†ãªå ´åˆã 。既ã«Scalaコード上ã«case class
ãªã©ã®å½¢ã§ãƒ‡ãƒ¼ã‚¿æ§‹é€ ãŒå®šã¾ã£ã¦ã„ã‚‹å ´åˆã¯ã€Opticsã®å®šç¾©ã¯å˜ãªã‚‹å†—é•·ãªãƒœã‚¤ãƒ©ãƒ¼ãƒ—レートã«ã—ã‹è¦‹ãˆãªã„ã ã‚ã†ã€‚
ã¾ãŸã€ãƒœãƒˆãƒ アップãªã‚¢ãƒ—ãƒãƒ¼ãƒã¯è¦šãˆã‚‹ã“ã¨ãŒå¢—ãˆã¦èªçŸ¥çš„è² è·ã‚’増やã—ã¦ã—ã¾ã†ã‹ã‚‚ã—ã‚Œãªã„。
ã‚ã‚ã›ã¦èªã¿ãŸã„
Lensã¯åŒæ–¹å‘ã®ãƒ‡ãƒ¼ã‚¿ãƒ•ãƒãƒ¼ã‚’åˆæˆå¯èƒ½ãªå½¢ã§æŠ½è±¡åŒ–ã—ãŸã‚‚ã®ã§ã‚ã‚‹ã¨ã„ã†è¦‹æ–¹ã‚‚ã§ãã¦ã€ã“ã‚Œã§NNを作ã£ã¦ã„る事例もã‚ã‚‹
Monocleã¯ã€Scalaã®Opticsライブラリ。
メモ
Opticsã¯ä¸€ç¨®ã®å°„ãªã®ã ã‹ã‚‰ã€Arrowã¨ã‹ArrowChoiceã§éŠã¹ã‚‹ã‹ã‚‚ã—ã‚Œãªã„。
Opticsã¯ã€ãƒ‡ãƒ¼ã‚¿ã®å–得方法ã®å®šç¾©ã¨ã€å®Ÿéš›ã®å–å¾—ã¨ã‚’分離ã—ã¦è¨˜è¿°ã§ãるよã†ã«ã™ã‚‹ã€‚ ã“ã‚Œã¯ä¸€ç¨®ã®DSLを構築ã™ã‚‹ã¨ã‚‚ã„ãˆã¦ã€ä¾‹ãˆã°xpathã¨ã‹jqã¨ã‹ã«å¯¾å¿œã—ãŸopticsを書ã‘ã°è¨€èªžå†…ã§å®‰å…¨ã«ã€ã—ã‹ã—一見動的ã«è¦‹ãˆã‚‹ãƒ‡ãƒ¼ã‚¿å–り出ã—ãŒã§ãるよã†ã«ãªã‚‹ã€‚ã‚る特定ã®ãƒ‡ãƒ¼ã‚¿ã‚’扱ã†ã®ã§ã¯ãªãã€ã‚るデータフォーマットã«å¯¾å¿œã—ãŸDSLを構築ã™ã‚‹ã¨ä¾¿åˆ©ã ã‚ã†ï¼ˆCSSセレクタã¨ã‹ã€XPathã¨ã‹ï¼‰ã€‚
直接Lensを書ãã®ã§ã¯ãªãã€Lens Generatorã®ã‚ˆã†ãªã‚‚ã®ã‚’DSLã¨ã—ã¦ç”¨æ„ã™ã‚‹ã¨ä¸€æ°—ã«ä¾¿åˆ©ã«ãªã‚‹ã€‚