【发布时间】:2015-12-28 02:18:26
【问题描述】:
我已经编码两年了。我不能说我是专家。
我参加了一门函数式编程课程,其中我们使用了 Common Lisp。我听说了很多关于 Scala 的好消息,作为一种“新”语言并想学习它。我读了一本关于基础知识的书,想将我们在 Lisp 中所做的所有代码重写为 Scala。几乎所有代码都在通过列表,这就是我发现问题的地方。我可以通过递归遍历将其设置为List[Any] 的列表来解决的大多数问题 - 例如:
def reverse(thelist: List[Any]):List[Any].....
但我发现除了.isInstanceOf[List[Any]] 之外,没有特定的方法可以检查列表的头部是否是列表本身
一开始还可以,但现在我遇到了问题。 Any 不是很具体,尤其是在比较元素时。如果我想拥有一个等效列表,比方说只有Int,我可以创建一个List[Int],它只能将Int 值作为元素,其中任何一个都不能是List[Int] 本身。另一种方式,写List[List[Int]] 有同样的问题,但反过来,因为每个元素都必须是List。
作为解决方案,我尝试将原始列表设置为 List[Either[Int,List[Int]]],但这只会产生更多问题,因为现在我必须在所有 if 和递归调用中不断编写 .isInstanceOf 和 .asInstanceOf,这非常耗时,并且使代码更难理解。但即使List[Either[Int,List[Int]]] 也是一个临时解决方案,因为它只深入一层。一个列表可以包含一个可以包含一个列表的列表......等等。
Scala 是否提供了一个我还不知道的更优雅的解决方案,例如以某种方式使用类或对象,或者一个简单优雅的解决方案,还是我坚持编写这种代码?为了让我的问题更具体,Scala 中是否有一种方法可以定义一个列表,该列表可以但不必包含与元素相同类型的列表?
【问题讨论】:
-
请清理您的格式。缺乏可读性。
-
重新格式化。希望对您有所帮助。
标签: list scala functional-programming nested-lists