当前位置:  开发笔记 > 编程语言 > 正文

(Scala)可以包含列表作为元素的列表

如何解决《(Scala)可以包含列表作为元素的列表》经验,为你挑选了1个好方法。

我已经编码了两年了.我不能说我是专家.

我参加过函数式编程课程,其中我们使用了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中是否有一种方法可以定义一个可以但不必包含与元素相同类型的列表的列表?



1> Seth Tisue..:

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的解决方案.

使用asInstanceOfisInstanceOf在Scala代码中也不常见.它们故意隐藏着长篇名称 - 除非在极少数情况下,否则不打算使用它们.

相反,使用模式匹配.它相当于isInstanceOfasInstanceOf你一样,但更简洁,更不容易出错.同样,任何介绍性的Scala文本都应该很好地覆盖了模式匹配以及如何使用它(例如,第15章).


@ Nik.S.不完全的.嘴唇使用所有东西的清单,有时它是好的,有时它不是.Scala(以及许多其他语言)为特定问题选择特定的数据结构.
推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有