如果我有一个函数List[A] => List[List[A]]
并且需要返回一个“空”值,那么以下是
a)Nil
b)List(Nil)
......还是取决于功能?
对于一个具体的例子,我可以实现一个函数来将列表拆分成长度为n
或更短的子列表,如下所示:
def sublists[A](xs: List[A], n: Int): List[List[A]] = {
val (ys, zs) = xs.splitAt(n)
if (zs.isEmpty) ys :: Nil
else ys :: sublists(zs, n)
}
如果xs
为空,则返回List(Nil)
。我是否需要检查xs
是否为空,返回Nil
,以确保此功能正确无误?
答案 0 :(得分:3)
毫无疑问,无论List元素的类型是什么,List的正确空值都是空List。
对于更详细的类型也是如此。包含空集的集与空集非常不同,等等。
可以这样想:列表结果可以让您问:我们有多少结果?如果使用带有空列表的列表作为空值,则答案将错误地为1。
答案 1 :(得分:1)
我会坚持Nil
,又名List()
。例如,
sublists(1 :: 2 :: 3 :: 4 :: Nil), 2)
返回
List(1 :: 2 :: Nil, 3 :: 4 :: Nil)
而不是
List(1 :: 2 :: Nil, 3 :: 4 :: Nil, Nil)
终端Nil
通常被砍掉。因此,为保持一致性,我会保留sublists(Nil) -> List()
。
答案 2 :(得分:0)
我不知道背景,所以我觉得不确定。总的来说,我认为答案是依赖于上下文的。在摘要中,我肯定更喜欢Nil作为客户端代码编写器 - 在结果上写一个闭包,我不认为我会期待一个空的子列表。
重新排列以在splitAt之前进行空值检查将完成这一操作。