ruby - 为什么 Haskell 没有符号(像 ruby​​)/原子(像 erlang)?

标签 ruby haskell erlang language-design language-features

我使用符号的两种语言是 Ruby 和 Erlang,我总是发现它们非常有用。

Haskell 确实有代数数据类型,但我仍然认为符号会非常方便。立即想到的一个用途是,由于符号与整数同构,您可以在使用整数或字符串“主键”的地方使用它们。

原子的语法糖可以是次要的 - :something 或 是一个原子。所有原子都是一个名为 Atom 的类型的实例,它派生出 Show 和 Eq。然后,您可以将其用于更具描述性的错误代码,例如

type ErrorCode = Atom
type Message = String
data Error = Error ErrorCode Message
loginError = Error :redirect "Please login first"

在这种情况下,:redirect 比使用字符串(“重定向”)更有效,并且比整数 (404) 更容易理解。

好处可能看起来很小,但我认为添加原子作为语言特性(或至少是 GHC 扩展)是值得的。

那么为什么符号没有被添加到语言中呢?还是我的想法不对?

最佳答案

我同意 camccann 的回答,它可能缺失,主要是因为它必须深入实现,而且对于这种复杂程度来说用处太小。在 Erlang(以及 Prolog 和 Lisp)中,符号(或原子)通常用作特殊标记,并且与构造函数的概念基本相同。在 Lisp 中,动态环境包括编译器,因此它在一定程度上也是泄漏到运行时的(有用的)编译器概念。

问题如下,符号驻留是不纯的(它修改了符号表)。因为我们从不修改现有对象,所以它是引用透明的,但是,如果实现得太天真,可能会导致运行时空间泄漏。事实上,正如目前在 Erlang 中实现的那样,您实际上可以通过驻留过多的符号/原子(我认为当前限制为 2^20)来使 VM 崩溃,因为它们永远无法被垃圾收集。如果符号表周围没有巨大的锁,它也很难在并发设置中实现。

然而,这两个问题都可以(并且已经)得到解决。例如,参见 Erlang EEP 20 .我在 simple-atom 中使用了这种技术包裹。它在后台使用 unsafePerformIO,但仅在(希望)极少数情况下使用。它仍然可以使用 GC 的一些帮助来执行类似于间接缩短的优化。它还在内部使用了相当多的 IORef,这对于性能和内存使用来说并不是很好。

总而言之,这是可以做到的,但正确实现它并非易事。编译器编写者总是会权衡功能的强大功能及其实现和维护工作,而一流的符号似乎输给了这个功能。

关于ruby - 为什么 Haskell 没有符号(像 ruby​​)/原子(像 erlang)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6164260/

相关文章:

Ruby Savon 身份验证

ruby - 大写方法不返回大写字符串

python - 我们怎么称呼这个(新的?)高阶函数?

解析一系列 lambda 演算术语

list - 检查两个列表是否包含相同的元素

python - 制作小 'Connect to a SSL webpage' 脚本的最快语言

haskell - 如何在 Haskell 中编写多行字符串?

erlang - 从 io :format in Erlang 中删除尾随 ok

Erlang:生成列表中的奇怪字符

Ruby:读取临时 zip 文件