gpt4 book ai didi

syntax - 是否有函数式编程语言具有用于更改对象部分的语法糖?

转载 作者:行者123 更新时间:2023-12-02 16:30:11 27 4
gpt4 key购买 nike

在命令式编程中,有简洁的语法糖用于更改对象的一部分,例如分配给字段:

foo.bar = new_value

或者数组的元素,或者在某些语言中是类似数组的列表:

a[3] = new_value

在函数式编程中,习惯用法不是改变现有对象的一部分,而是创建一个具有大部分相同值但该字段或元素具有不同值的新对象。

在语义层面,这极大地提高了理解和编写代码的便利性,尽管并非没有权衡。

我在这里询问语法级别的权衡。一般来说,创建一个具有大部分相同值但一个字段或元素具有不同值的新对象,就其在代码中的外观而言是一个更重量级的操作。

是否有任何函数式编程语言提供语法糖,使该操作看起来更简洁?显然你可以编写一个函数来完成它,但是命令式语言提供了语法糖,使其比调用过程更简洁;是否有任何函数式语言提供语法糖以使其比调用函数更简洁?我可以发誓,我至少在某种函数式语言中见过针对 object.field 情况的语法糖,尽管我忘记了它是哪一种。

(性能超出了这里的范围。在这种情况下,我只讨论代码的外观和功能,而不是它的执行速度。)

最佳答案

Haskell 记录具有此功能。您可以将记录定义为:

data Person = Person
{ name :: String
, age :: Int
}

还有一个实例:

johnSmith :: Person
johnSmith = Person
{ name = "John Smith"
, age = 24
}

并创建一个替代:

johnDoe :: Person
johnDoe = johnSmith {name = "John Doe"}
-- Result:
-- johnDoe = Person
-- { name = "John Doe"
-- , age = 24
-- }

但是,当您必须更新深度嵌套的记录时,此语法很麻烦。我们有一个库 lens 可以很好地解决这个问题。


但是,Haskell 列表不提供更新语法,因为列表上的更新将具有 O(n) 成本 - 它们是单链接列表。

如果您希望对类似列表的集合进行高效更新,可以在数组包中使用Array,或在向量包中使用Vector。它们都有用于更新的中缀运算符 (//):

alteredVector = someVector // [(1, "some value")]
-- similar to `someVector[1] = "some value"`

它不是内置的,但我认为中缀表示法足够方便!

关于syntax - 是否有函数式编程语言具有用于更改对象部分的语法糖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63628595/

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