Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 我应该使用列表[A]或序列[A]还是其他什么?_Design Patterns_Scala - Fatal编程技术网

Design patterns 我应该使用列表[A]或序列[A]还是其他什么?

Design patterns 我应该使用列表[A]或序列[A]还是其他什么?,design-patterns,scala,Design Patterns,Scala,我在写一个包含函数式方法的类。首先,我使用列表作为参数和返回类型编写它们。然后我想“嘿,你也可以使用一种更通用的类型!”所以我用Seq替换了列表,希望有一天我可以通过给它们提供列表以外的东西来让我的东西更快 那么,我应该为哪种通用堆栈式数据结构编写方法和算法呢?有什么我可以坚持的一般模式吗?所有这一切都是因为这些方法可能需要在未来得到优化,以防它们形成瓶颈 更新 我会尽量说得更准确一点: 如果您知道正在使用哪些操作,例如反转、.tail、直接元素访问或理解。我能选择一种能提高这些操作效率的类型吗

我在写一个包含函数式方法的类。首先,我使用列表作为参数和返回类型编写它们。然后我想“嘿,你也可以使用一种更通用的类型!”所以我用Seq替换了列表,希望有一天我可以通过给它们提供列表以外的东西来让我的东西更快

那么,我应该为哪种通用堆栈式数据结构编写方法和算法呢?有什么我可以坚持的一般模式吗?所有这一切都是因为这些方法可能需要在未来得到优化,以防它们形成瓶颈

更新 我会尽量说得更准确一点: 如果您知道正在使用哪些操作,例如反转、.tail、直接元素访问或理解。我能选择一种能提高这些操作效率的类型吗

更新2 我非常了解各种任务的具体数据结构的性能。我不知道哪个数据结构可能会显示为某个超类型的子类

例如,我应该使用TraversableOnce或IndexedSeq而不是List或Array吗?它能给我买点什么吗

补充问题 默认的数据结构签名列表是什么?你写作吗

def a(b: List[A]): List[A] 


你能解释一下原因吗?

List
LinearSeq
的默认实现,而LinearSeq又是
Seq
的默认实现,而
Iterable
又是
Traversable
的默认实现

请参阅图表,并根据您的要求选择最通用的类型




文档可能也会有所帮助。

有关收藏库的背景信息,请参阅本文

如果您考虑了具体的操作,那么请特别关注

关于是否使用更一般特性的特定类型的设计选择,我认为这取决于您在实现中所做的工作。例如,如果一个方法接受一个列表,它可以依靠fastpresend,并可以在其实现中使用它。因此,接受一个更普遍的特征可能会产生不想要的绩效结果。此外,你还得担心你会得到什么样的回报

scala> def a[A](t:TraversableOnce[A]): TraversableOnce[A] = t
a: [A](t: TraversableOnce[A])TraversableOnce[A]

scala> a(List(1,2))
res0: TraversableOnce[Int] = List(1, 2)

scala> res0.tail
<console>:8: error: value tail is not a member of TraversableOnce[Int]
       res0.tail
scala>defa[a](t:TraversableOnce[a]):TraversableOnce[a]=t
a:[a](t:TraversableOnce[a])TraversableOnce[a]
scala>a(列表(1,2))
res0:TraversableOnce[Int]=列表(1,2)
scala>res0.tail
:8:错误:值尾不是TraversableOnce[Int]的成员
res0.tail

如果您想写一些通用的东西,您可能需要保留这些类型。请参阅,了解您将遇到的问题和一些解决方案。

我认为,一般来说,您应该使用
Seq
作为参数,并设计有效使用
列表的方法。这样,您的方法可以与大多数
Seq
实现配合使用,并且在使用方法之前,您不必转换Seq

编辑

你的问题里面有很多问题

  • 那么,我应该为哪种通用堆栈式数据结构编写方法和算法呢?
    • 我想这里的答案是
      List
      。这是一个堆栈,速度非常快
  • 我能选择一种能提高这些操作效率的类型吗?
    • 一般来说,您必须依赖Concerte实现。性能特征如下所示
  • 例如,我应该使用TraversableOnce或IndexedSeq而不是List或Array吗?它能给我买点什么吗?
    • 有些抽象定义了性能特征,有些则没有。例如,
      IndexedSeq
      scaladoc说“索引序列支持恒定时间或接近恒定时间的元素访问和长度计算”。如果您有一个
      IndexedSeq
      参数,并且有人传递了一个
      IndexedSeq
      实现,而该实现没有“近乎恒定的时间元素访问权”,那么有人正在违反合同,这不是您的问题
  • 默认的数据结构签名列表是什么?
    • 序号

  • 也许我面临的问题是,我知道可能有5个集合实现和50个超级类型/特征。我知道我必须选择哪种实现,但不知道选择哪种特性。这基本上就是我在项目中所做的。这是我希望得到的答案,但现在我想可能还没有一个好的全面的答案。一个问题是你的问题里面有很多问题,我更新了我的答案,试图更具体地解决每个问题
    scala> def a[A](t:TraversableOnce[A]): TraversableOnce[A] = t
    a: [A](t: TraversableOnce[A])TraversableOnce[A]
    
    scala> a(List(1,2))
    res0: TraversableOnce[Int] = List(1, 2)
    
    scala> res0.tail
    <console>:8: error: value tail is not a member of TraversableOnce[Int]
           res0.tail