2010-12-20 52 views
20

爲什麼在Scala中沒有隱式的列表排序有沒有原因?爲什麼Scala List沒有訂購?

val lists = List(List(2, 3, 1), List(2, 1, 3)) 
lists.sorted 

error: could not find implicit value for parameter ord: Ordering[List[Int]] 

編輯

是的,我的問題是,爲什麼沒有內置訂購這已經隱含在範圍內。對我來說,第二個列表顯然應該是「小於」第一個列表,因爲0處的項目是相等的,第二個列表中的下一個項目是1.我想知道是否可能沒有好的答案列表有兩種不同的大小。

+2

字典序(你描述)可定義爲不同大小的名單,但你需要做出選擇,以更短的名單是否長於列出大於或較小。這兩種方法都可以用來創建數學有效的訂單,而較短的<更長的選項可能適合更多的用例,而更短的>更長的選項也可以使用。這可能是爲什麼在標準庫的List中沒有提供隱式排序的原因,但我仍然認爲缺少一般的有用性是更可能的原因。 – 2010-12-20 20:24:06

回答

42

我認爲這是一個疏忽。在Seqs上,詞典排序確實有意義。我們應該將其添加到標準庫。

+1

謝謝!我看到你提出了一個跟蹤器:http:// lampsvn。epfl.ch/trac/scala/ticket/4097 – 2010-12-20 22:42:35

+0

如果元素類型沒有'Ordering',那麼缺省值是什麼?resp不是'Ordered'? – Raphael 2011-03-13 10:23:31

+0

添加到標準庫有何進展? – user222202 2012-01-11 08:55:36

4

你有什麼是列表的列表,而不是整數列表。你缺少的是確定列表是否爲< =另一個列表的標準,或者不是。

這就是錯誤消息所說的:我無法找到一種方法將列表與另一個列表進行比較,您應該明確提供一個列表。

如果你的問題是「爲什麼不列出有一個內置的比較方法與其他列表」,那麼,就是這樣。

+0

我認爲他的問題是爲什麼沒有確定列表是否是另一個列表的隱式標準。 – 2010-12-20 19:46:52

4

List [Int]類唯一真正明智的總體順序是詞典(即比較列表的第一個元素,然後第二個如果相等,第三個如果秒相等,等等)。這不是標準庫提供的,可能是因爲沒有那麼多的實際需要的情況。創建一個從List [X]到Ordering [List [X]]的隱式轉換就足夠簡單了,它將實現該轉換,然後您可以在需要的任何地方簡單地導入該轉換。

1

您可以使用sortWith。這並不需要不同尺寸的列表考慮,因爲ZIP會拋出的區別,但我認爲它確實像你以後:

lists.sortWith((a,b) => { 
    a.zip(b).filterNot(x => x._1 == x._2) match { 
    case Nil => true 
    case t => t._1 < t._2 
    } 
}) 
7

順便說一句我之前也解決了這個問題,你可以做到這一點其他的方法:

scala> List[Iterable[Int]](List(2, 3, 1), List(2, 1, 3)).sorted 
res0: List[Iterable[Int]] = List(List(2, 1, 3), List(2, 3, 1)) 

scala> List(List(2, 3, 1), List(2, 1, 3)).sorted(Ordering[Iterable[Int]]) 
res1: List[List[Int]] = List(List(2, 1, 3), List(2, 3, 1)) 

但現在它就像你的希望。

編輯:由於粗略的分歧問題與必要的隱式我把它移出默認範圍。有一個隱含的轉換,如下所示跨越一個綁定:

implicit def SeqDerived[CC[X] <: collection.Seq[X], T](implicit ord: Ordering[T]): Ordering[CC[T]] 

...是潛在的問題處方。它將在2.9版本中提供,但您必須按如下方式導入它。

scala> val lists = List(List(2, 3, 1), List(2, 1, 3)) 
lists: List[List[Int]] = List(List(2, 3, 1), List(2, 1, 3)) 

scala> lists.sorted 
<console>:9: error: could not find implicit value for parameter ord: Ordering[List[Int]] 
     lists.sorted 
      ^

scala> import Ordering.Implicits._ 
import Ordering.Implicits._ 

scala> lists.sorted 
res1: List[List[Int]] = List(List(2, 1, 3), List(2, 3, 1)) 
相關問題