仮定:
- ネストされた JSON 文字列を解析したい。
- Haskell は型システムを使用して問題を解決することを推奨しており、Clojure は型システムを避け、データ構造を使用して問題を解決することを好みます。
- 両方の言語でこのプロセスがdestructuringと呼ばれていることは承知していますが、Clojure では別の名前がありませんが、Haskell ではこれもusing a lensと呼ばれているため、Clojure を 1 つのdestructuringと呼んでいます。の上
Haskell で次のようなレンズ を作成できることがわかります。
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
initialState :: Game
initialState = Game
{ _score = 0
, _units =
[ Unit
{ _health = 10
, _position = Point { _x = 3.5, _y = 7.0 }
}
]
}
health :: Lens' Unit Int
health = lens _health (\unit v -> unit { _health = v })
その目的は、データ構造health
から値を取得することです。game
Clojure では、次のような構造化を行うことができます。
user=> (def book {:name "SICP" :details {:pages 657 :isbn-10 "0262011530"}})
#'user/book
user=> (let [{name :name {pages :pages isbn-10 :isbn-10} :details} book]
(println "name:" name "pages:" pages "isbn-10:" isbn-10))
name: SICP pages: 657 isbn-10: 0262011530
目的は、ネストされた構造から名前、ページなどのネストされた値を取得することです。
どちらの場合も、ネストされた構造から値を再利用可能に取得するメカニズムを考え出しています。
私の質問は、Haskell のレンズと Clojure の破壊の類似点と相違点は何ですか?