我使用符号的两种语言是 Ruby 和 Erlang,我总是发现它们非常有用。
Haskell 确实有代数数据类型,但我仍然认为符号会非常方便。立即想到的一个用途是,由于符号与整数同构,您可以在使用整数或字符串“主键”的地方使用它们。
原子的语法糖可以是次要的 - :something 或
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/