首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell中的透镜与Clojure中的破坏有什么相似之处?

Haskell中的透镜与Clojure中的破坏有什么相似之处?
EN

Stack Overflow用户
提问于 2015-02-14 11:00:48
回答 1查看 240关注 0票数 1

假设:

  • 我想解析一个嵌套的JSON字符串。
  • 我知道Haskell鼓励用类型系统解决问题,Clojure则鼓励使用类型系统解决问题,更喜欢用数据结构来解决问题。
  • 我知道,在这两种语言中,这个过程都被称为析构--但在Clojure中没有其他名称,而在Haskell中,这也称为使用镜头,所以我将Clojure称为析构,然后继续前进

我们可以看到我们可以在Haskell中创建一个透镜 像这样

代码语言:javascript
复制
{-# 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中销毁像这样

代码语言:javascript
复制
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中的破坏有什么相似之处?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-14 13:24:34

在Haskell中,您的Clojure代码最接近于这样的表示:

代码语言:javascript
复制
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等(就像成员名称一样)。它们分别采用GameUnitPoint,并生成各自成员的值。如果必须手动定义这些函数(因为Haskell会自动为所有记录类型定义这些函数),则如下所示:

代码语言:javascript
复制
_health (Unit {health = h}) = h

到目前为止,这仍然与镜片无关。

代码中的镜头是health。它包含函数_health (如所述,它接受一个Unit并生成它的健康状态)和函数(\unit v -> unit { _health = v }),该函数接受一个单元和一个值,并生成一个新的单元,其健康状态已被设置为该值。换句话说,镜头包含获取和设置单元健康状态的代码。镜头库现在包含各种功能,您可以使用这些镜头组成和工作。

因此,要回答你的问题:镜片和破坏性之间没有相似之处。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28514930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档