小编yhm*_*yhm的帖子

猫的NonEmptyList与Scala stdlib ::

我最近正在学习猫库,并且遇到过名为NonEmptyList的此类。

阅读了api之后,我不禁想知道是什么使猫的作者创建了一个新类,而不是利用内置的(::)并使用类型类对其进行扩展。它甚至没有在cats github页面上列出,所以我来这里问这个问题。也许是因为cons是List的子类型?(尽管我不知道它的含义)

::和NEL有什么区别?为什么猫的作者不得不写NEL而不是使用::?

scala scala-cats

4
推荐指数
1
解决办法
258
查看次数

为什么Scala中的FunctionN类型是作为AnyRef的子类型而不是AnyVal创建的?

如果我理解正确,在JVM下,每次使用lambda表达式时,都必须创建一个Object.

为什么开销?为什么Scala创建者在设计FunctionN类型时选择扩展AnyRef而不是AnyVal?我的意思是,它们本身没有任何真正的"值",所以函数不应该是具有底层单位表示的值对象(或者包含一些哈希用于相等性检查或其他什么)?我可以想象不为每个lambda分配一个对象可以在某些代码库中导致性能提升.

我想到扩展AnyVal的一个明显缺点是它会禁止子类化函数类型.也许仅仅这一点就足以不延长AnyVal,但还有其他原因吗?

- 编辑

我理解函数需要关闭其他变量,但我认为将它建模为apply方法的参数更自然,而不是FunctionN对象的字段成员(从而消除了在此处拥有java.lang.Object的必要性) part) - 毕竟,编译时所有已知的变量是不是已关闭?

- 再次编辑

我发现了它; 我想到的是'lambda lifting'.

scala

1
推荐指数
1
解决办法
73
查看次数

标签 统计

scala ×2

scala-cats ×1