我已经编码了两年了.我不能说我是专家.
我参加过函数式编程课程,其中我们使用了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]]]
,但只创造了更多的问题,因为现在我要不断谱写.isInstanceOf
,并.asInstanceOf
在所有我如果和递归调用,这是费时,使代码难以理解.但即便List[Either[Int,List[Int]]]
是一个临时的解决方案,因为它只有一个层次.列表可以包含可以包含列表的列表......等等.
Scala是否提供了一个我还不知道的更优雅的解决方案,例如以某种方式使用类或对象,或简单优雅的解决方案,还是我坚持编写这种代码?为了使我的问题更具体,Scala中是否有一种方法可以定义一个可以但不必包含与元素相同类型的列表的列表?
Scala不仅仅是具有不同语法的Common Lisp.对所有内容使用列表是Lisp特有的,而不是其他语言.
在Scala中,使用异构列表是不正常的 List[Any]
- 对于任何事情.如果你愿意,你当然可以,但这不是通常编写Scala代码的方式.当你刚刚开始学习语言时,当然不是你应该编写的那种代码.
包含数字和列表混合的列表实际上不是列表 - 它是一棵树.在Scala中,我们根本不表示使用树List
- 我们定义了一个合适的树数据类型.任何介绍性Scala文本都包含此示例.(例如,参见Scala编程第15章中的表达式树.)
至于你的reverse
例子,在Scala中我们通常不会写:
def reverse(thelist: List[Any]): List[Any]
相反,我们写道:
def reverse[T](theList: List[T]): List[T]
它可以工作,List[Any]
但也适用于更具体的类型,如List[Int]
.
如果你坚持用另一种方式做,那你就不是在学习斯卡拉 - 你正在与它作斗争.任何时候你认为你需要Any
或者List[Any]
,有更好的,更惯用的,更像Scala的解决方案.
使用asInstanceOf
或isInstanceOf
在Scala代码中也不常见.它们故意隐藏着长篇名称 - 除非在极少数情况下,否则不打算使用它们.
相反,使用模式匹配.它相当于isInstanceOf
和asInstanceOf
你一样,但更简洁,更不容易出错.同样,任何介绍性的Scala文本都应该很好地覆盖了模式匹配以及如何使用它(例如,第15章).