gpt4 book ai didi

haskell - 使用记录语法在 Haskell 中编写 OOP 风格的 "setter"函数

转载 作者:行者123 更新时间:2023-12-02 11:14:47 25 4
gpt4 key购买 nike

我正在阅读a tutorial在简介中,作者通过展示一些我们如何使用标准 Haskell 实现 OOP 风格的“setter”/“getter”的示例来激发 lens 概念。我对下面的例子感到困惑。

假设我们按照图 1(如下)定义了一个 User 代数数据类型。本教程(正确地)指出,我们可以通过 NaiveLens 数据类型和 nameLens 函数(也在图 1 中)实现“setter”功能。图 2 给出了一个示例用法。

我很困惑为什么我们需要如此复杂的构造(即 NaiveLens 数据类型和 nameLens 函数)来实现“setter”功能,当以下(有些明显)函数似乎同样出色地完成这项工作时:set' a s = s {name = a}

然而,鉴于我的“明显”函数正是 nameLens 的一部分的 lambda 函数,我怀疑使用下面的构造确实有一个优点,但我太密集了看看这个优势是什么。我希望一位 Haskell 巫师能够帮助我理解。

图 1(定义):

data User = User { name :: String
, age :: Int
} deriving Show

data NaiveLens s a = NaiveLens { view :: s -> a
, set :: a -> s -> s
}

nameLens :: NaiveLens User String
nameLens = NaiveLens name (\a s -> s {name = a})

图 2(示例用法):

λ: let john = User {name="John",age=30}
john :: User

λ: set nameLens "Bob" john
User {name = "Bob", age = 30}
it :: User

最佳答案

镜头的主要优点是它们组合,因此它们可用于访问和更新嵌套记录中的字段。使用记录更新语法手动编写这种嵌套更新很快就会变得乏味。

关于haskell - 使用记录语法在 Haskell 中编写 OOP 风格的 "setter"函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27025679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com