假设:
- 我想解析一个嵌套的 JSON 字符串。
- 我知道 Haskell 鼓励用类型系统解决问题,而 Clojure 避开类型系统,更喜欢用数据结构解决问题。
- 我知道在这两种语言中,这个过程都被称为解构——但它在 Clojure 中没有另一个名字,而在 Haskell 中,这也被称为使用 lens,所以我将 Clojure 称为解构和移动上
{-# 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 中的解构有何异同?