我最近正在学习猫库,并且遇到过名为NonEmptyList的此类。
阅读了api之后,我不禁想知道是什么使猫的作者创建了一个新类,而不是利用内置的(::)并使用类型类对其进行扩展。它甚至没有在cats github页面上列出,所以我来这里问这个问题。也许是因为cons是List的子类型?(尽管我不知道它的含义)
::和NEL有什么区别?为什么猫的作者不得不写NEL而不是使用::?
如果我理解正确,在JVM下,每次使用lambda表达式时,都必须创建一个Object.
为什么开销?为什么Scala创建者在设计FunctionN类型时选择扩展AnyRef而不是AnyVal?我的意思是,它们本身没有任何真正的"值",所以函数不应该是具有底层单位表示的值对象(或者包含一些哈希用于相等性检查或其他什么)?我可以想象不为每个lambda分配一个对象可以在某些代码库中导致性能提升.
我想到扩展AnyVal的一个明显缺点是它会禁止子类化函数类型.也许仅仅这一点就足以不延长AnyVal,但还有其他原因吗?
- 编辑
我理解函数需要关闭其他变量,但我认为将它建模为apply方法的参数更自然,而不是FunctionN对象的字段成员(从而消除了在此处拥有java.lang.Object的必要性) part) - 毕竟,编译时所有已知的变量是不是已关闭?
- 再次编辑
我发现了它; 我想到的是'lambda lifting'.