更正List [List [X]]的“空”返回值

时间:2013-11-13 19:23:17

标签: scala functional-programming null

如果我有一个函数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,以确保此功能正确无误?

3 个答案:

答案 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之前进行空值检查将完成这一操作。