假设:
我们可以看到我们可以在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中的破坏有什么相似之处?
发布于 2015-02-14 13:24:34
在Haskell中,您的Clojure代码最接近于这样的表示:
book :: Book
book = Book {name = "SICP", details = Details {pages = 657, isbn_10: "0262011530"}}
main = do
let Book {name = name, details = Details {pages = pages, isbn_10 = isbn_10}} = book
putStrLn $ "name:" ++ name ++ "pages:" ++ (show pages) ++ "isbn-10:" ++ isbn-10在这里,我们使用Haskell的模式匹配(它基本上是Clojure的析构绑定的一种更一般的形式)来获取记录的内容。这与镜片无关。
现在让我们来看看带镜头的Haskell代码。这段代码有三种记录类型,Game、Unit和Point,这些类型都有一组自动定义的函数来访问它们的成员,而没有模式匹配。这些函数被称为_score、_health、_x等(就像成员名称一样)。它们分别采用Game、Unit或Point,并生成各自成员的值。如果必须手动定义这些函数(因为Haskell会自动为所有记录类型定义这些函数),则如下所示:
_health (Unit {health = h}) = h到目前为止,这仍然与镜片无关。
代码中的镜头是health。它包含函数_health (如所述,它接受一个Unit并生成它的健康状态)和函数(\unit v -> unit { _health = v }),该函数接受一个单元和一个值,并生成一个新的单元,其健康状态已被设置为该值。换句话说,镜头包含获取和设置单元健康状态的代码。镜头库现在包含各种功能,您可以使用这些镜头组成和工作。
因此,要回答你的问题:镜片和破坏性之间没有相似之处。
https://stackoverflow.com/questions/28514930
复制相似问题