Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/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
Scala 如何使咖喱合并排序正确通用_Scala - Fatal编程技术网

Scala 如何使咖喱合并排序正确通用

Scala 如何使咖喱合并排序正确通用,scala,Scala,在中,有一个合并排序的实现,它在内部使用一个比较函数: def mergeSort[T <% Ordered[T]](less: (T, T) => Boolean)(list: List[T]): List[T] = { def merge(xs: List[T], ys: List[T]): List[T] = { if (xs.isEmpty) ys else if (ys.isEmpty) xs else if (less(xs.head, ys

在中,有一个合并排序的实现,它在内部使用一个比较函数:

def mergeSort[T <% Ordered[T]](less: (T, T) => Boolean)(list: List[T]): List[T] = {

  def merge(xs: List[T], ys: List[T]): List[T] = {
    if (xs.isEmpty) ys
    else if (ys.isEmpty) xs
    else if (less(xs.head, ys.head)) xs.head :: merge(xs.tail, ys)
    else ys.head :: merge(ys.tail, xs)
  }

  val n = list.length / 2
  if (n == 0) list
  else merge(mergeSort(less)(list.take(n)), mergeSort(less)(list.drop(n)))
}
解决这个问题的方法似乎是在其中抛出一个类型参数。或者

def basicMergeSort = mergeSort[Int](orderedLess)_

将编译,但我希望能够传递任何类型的有序类型。我做错了什么?我是Scala的新手,所以我可能完全误解了一些事情,但我并不是真的在摸索这些错误。

首先:

你永远不会看到像[T]这样的布尔值。 您希望用户指定一个比较函数,或者希望隐式排序,以便可以访问默认的比较函数。您可以在std库中看到这一点

 def sortWith(lt: (A, A) => Boolean): List[A] 
 def sorted[B >: A](implicit ord: math.Ordering[B]): List[A]
所以我会留下你链接上的签名

def mergeSort[T]less:T,T=>Booleanlist:List[T]:List[T]

现在回到问题上来

解决方案1

这与您的方法类似。编译器似乎需要有关类型的附加信息

def orderedLess[T <% Ordered[T]](x: T, y: T) = x < y
def basicMergeSort[T <% Ordered[T]] = mergeSort[T](orderedLess)_ 
编译器不会为您推断类型,您也不能对apply使用sugar语法。 def basicMergeSort[T Ordered[T]并且当尝试调用basicMergeSort[Char]List'a'、'd'、'c'时,它会将该列表视为隐式参数,当然这是行不通的

解决方案2

这是一种不使用curry的解决方案,它基本上是一种只接受具有隐式排序的元素的列表并使用mergeSort和所需函数的方法

def basicMergeSort[T <% Ordered[T]](list: List[T]) = mergeSort((x: T, y: T) => x < y)(list)
最后的话


我真的很不高兴我找不到一个好的方法来做咖喱。也许有人有更深刻的见解可以提供更好的答案。

谢谢!你的第一点对我来说很有意义,所以我在这里学到了一些东西,即使这不是我的本意:解决方案2做了我想做的事情,没有任何可怕的缺点,但我同意,我喜欢我想看看这里的咖喱应该怎么做。
def basicMergeSort = mergeSort(orderedLess[Int])_
 def sortWith(lt: (A, A) => Boolean): List[A] 
 def sorted[B >: A](implicit ord: math.Ordering[B]): List[A]
def orderedLess[T <% Ordered[T]](x: T, y: T) = x < y
def basicMergeSort[T <% Ordered[T]] = mergeSort[T](orderedLess)_ 
def basicMergeSort[T <% Ordered[T]] = mergeSort((x: T, y: T) => x < y) _
basicMergeSort[Char].apply(List('a','d','c'))
def basicMergeSort[T <% Ordered[T]](list: List[T]) = mergeSort((x: T, y: T) => x < y)(list)
basicMergeSort(List('a','d','c'))