Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
猫';NonEmptyList vs scala stdlib::_Scala_Scala Cats - Fatal编程技术网

猫';NonEmptyList vs scala stdlib::

猫';NonEmptyList vs scala stdlib::,scala,scala-cats,Scala,Scala Cats,我最近在学习cats库,我遇到了一个叫做NonEmptyList的类 在阅读了api之后,我不禁想知道是什么让cats作者创建了一个新类,而不是利用内置的东西(:)并使用类型类来扩展它。它甚至没有在cats github页面中列出,所以我来这里询问它。可能是因为cons是列表的子类型?(虽然我不知道这意味着什么) :和NEL之间有什么区别?为什么cats的作者必须编写NEL而不是使用:?拥有非空列表的主要原因是开发人员在api中包含假设的经验 首先,请注意,:包含了列表中的所有方法,这些方法可能

我最近在学习cats库,我遇到了一个叫做
NonEmptyList
的类

在阅读了api之后,我不禁想知道是什么让cats作者创建了一个新类,而不是利用内置的东西(
)并使用类型类来扩展它。它甚至没有在cats github页面中列出,所以我来这里询问它。可能是因为cons是
列表的子类型
?(虽然我不知道这意味着什么)


NEL
之间有什么区别?为什么cats的作者必须编写
NEL
而不是使用

拥有
非空列表的主要原因是开发人员在api中包含假设的经验

首先,请注意,
包含了
列表
中的所有方法,这些方法可能会产生误导,这使得使用更强大的假设设计更好的API变得更加困难。另外,
List
没有任何直接返回
的方法,这意味着开发人员需要手动维护非空抽象

让我举一个例子,说明我在实践中的意思:

//非空列表的使用非常直观,类型可以很好地组合在一起
val nonEmpty:NonEmptyList[Int]=NonEmptyList.of(1,2,3)
val biggerNonEmpty:NonEmptyList[Int]=0::nonEmpty
val nonEmptyMapped:NonEmptyList[Int]=nonEmpty.map(*2)
//当前位置有很多问题
//问题:我们无法轻松实例化::
val cons::[Int]=1::2::3::Nil//类型不匹配;找到:列表[Int];必需::[Int]
val cons::[Int]=new:[Int](1,:(2,:(3,无)))
//问题:将新元素添加到Cons返回列表
val biggerCons::[Int]=0::cons//类型不匹配;找到:列表[Int];必需::[Int]
//问题:。映射返回列表
val consMapped::[Int]=cons.map(*2)//类型不匹配;找到:列表[Int];必需::[Int]
请注意,
NonEmptyList
具有返回
List
的方法,即
filter
filterNot
collect
。为什么?因为通过
NonEmptyList
进行过滤可能意味着过滤掉所有元素,列表可能会变为空

这就是为什么整个非空抽象如此强大的原因。通过正确使用函数输入和输出类型,可以对API的假设进行编码<代码>:
不提供此抽象