3

如果我有一个函数List[A] => List[List[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,才能使此功能正确?

4

3 回答 3

3

毫无疑问,List 的正确空值是空 List,无论 List 元素的类型是什么。

对于更详细的类型也是如此。包含空集的集合与空集非常不同,依此类推。

可以这样想:列表结果允许您问:我们有多少结果?如果您使用具有空 List 作为空值的列表,则答案将错误地为 1。

于 2013-11-14T08:10:35.897 回答
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().

于 2013-11-13T21:45:36.283 回答
0

我不知道上下文,所以我不习惯确定。总的来说,我认为答案取决于上下文。抽象地说,我肯定更喜欢 Nil 作为客户端代码编写者——在编写结果的闭包时,我不认为我会期待一个空的子列表。

重新安排将空检查放在 splitAt 之前就可以了。

于 2013-11-13T20:08:06.500 回答