我使用符号的两种语言是Ruby和Erlang,我一直认为它们非常有用.
Haskell确实有代数数据类型,但我仍然认为符号是非常方便的.令人想起的一个立即的用法是,因为符号与整数是同构的,所以你可以使用它们,使用整数或字符串“主键”.
原子的句法糖可以是次要的: – 某物或<某物>是一个原子所有原子是称为Atom的类型的实例,它导出Show和Eq.然后,您可以使用它来获取更多描述性的错误代码
type ErrorCode = Atom type Message = String data Error = Error ErrorCode Message loginError = Error :redirect "Please login first"
在这种情况下:重定向比使用字符串(“重定向”)更有效,并且比整数更容易理解(404).
这个好处可能看起来很小,但是我认为这是值得添加原子作为一个语言特征(或至少一个GHC扩展).
解决方法
我同意camccann的答案,它可能是失踪的,主要是因为它必须在实施过程中相当深入,而且对于这一级别的并发症来说,它的用处太少了.在Erlang(和Prolog和Lisp)中,符号(或原子)通常用作特殊标记,并且主要与构造函数相同.在Lisp中,动态环境包括编译器,所以它也部分地是泄漏到运行时的(有用的)编译器概念.
问题是如下,符号实习是不纯的(它修改符号表).因为我们永远不会修改现有的对象,它是透明的,但是如果天真实现可能会导致运行时空间泄漏.实际上,正如Erlang目前实现的那样,你实际上可能会通过实体太多的符号/原子(目前的限制是2 ^ 20,我认为),因为它们永远不会收集垃圾.在并发设置中也不难实现,而在符号表周围没有巨大的锁定.
然而,这两个问题都可以(并已经被解决)了.例如,请参阅Erlang EEP 20.我在simple-atom包中使用这种技术.它使用unsafePerformIO在引擎盖下,但只有(希望)罕见的情况.它仍然可以使用GC的一些帮助来执行类似于间接缩短的优化.它也在内部使用了相当多的IORef,这对于性能和内存使用来说并不算太大.
总而言之,可以做到这一点,但是正确执行它是不平凡的.编译器的作者总是把功能的权力与其实施和维护的努力进行比较,看起来像是一流的符号在这一个上失败了.