gpt4 book ai didi

haskell - Lisp 能否以不可变的函数式方式轻松使用?

转载 作者:行者123 更新时间:2023-12-02 04:08:58 26 4
gpt4 key购买 nike

我有 Haskell 背景,我想学习 Common Lisp。

大家都讨论过 CL“不是函数式语言”,但我想知道它是否可以用作函数式语言。

例如,是否可以以不可变的方式使用所有数据类型? Common Lisp 哈希表似乎是使用 setf 设置的,这显然是可变方向的。有没有办法以不可变的方式使用它?

除了与文件、网络等交互的 Common Lisp 的“IO”方面(Haskell 的“纯粹”方面)之外,我能否轻松地用 Lisp 编写代码并确保代码具有引用透明度?

我可以从 Common Lisp 中可用的流行库中获得这些类型的属性吗?

语言中是否有一些常见的习语或方面会让这些变得困难?

最佳答案

是的,当然,但根据您希望限制执行的程度,您的里程可能会有所不同。

只是不要变异

您可以简单地避免 setf 和所有地方的机器。如果必须使用哈希表或向量,您将进行大量复制,但对于许多应用程序来说,垃圾收集开销仍然是可以管理的。在许多地方,您可以使用 alist 或 plist,它们几乎可以像函数式数据结构一样进行处理。一些有用的实用程序位于alexandria,例如。 G。 copy-hash-table,它有一个 key 参数来实际执行类似于假设的 map-hash-table 的操作。所有其他功能优点,如高阶函数、map、reduce、remove 等,都有多种版本。此外,某些用例可以在循环中以声明方式解决。

还有一些库可以使这种风格变得更加容易,例如。 G。 modf .

这可以带你走很远。我认为很容易看出哪里破坏了引用透明度并避免这种情况。

使用函数式数据结构

FSet ,它为您提供了很多功能数据结构,其中有 sycamore ,这提供了更多。

使用传感器

SERIES 1990年出现在CLtL2中,1994年几乎成为标准。还有taps ,这增加了一些有用的功能。

冥想

就我个人而言,我不再那么追求纯洁了。有时,改变循环中的某个位置比在不同范围内处理多个绑定(bind)更容易理解。我只是限制突变;这类似于数据所有权概念。然而,我喜欢在更大范围内保持纯净,无论是在内存还是在磁盘上,例如。 G。仅附加日志、数据库 (bknr.datastore)。

关于haskell - Lisp 能否以不可变的函数式方式轻松使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54375478/

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