2016-12-10 3 views
1

Для следующего кода x<y часть запрашивает синтаксическую ошибку, могу ли я знать, следует ли ее модифицировать, чтобы включить сравнение?Ошибка синтаксиса сопоставлений сравнения

class SortAlgo { 
def insert[T](x:T, xs:List[T]): List[T]= xs match{ 
    case Nil=> List(x) 
    case y::ys=> 
    if(x<y) x::xs 
    else y::insert(x,ys) 
} 

def isort[T:Comparable](xs:List[T]): List[T]=xs match{ 

    case Nil => Nil 
    case x :: xs1 => insert(x, isort(xs1)) 
} 

} 

ответ

2

Если вы используете Ordering, вместо Comparable, вы можете import необходимые implicits для включения < сравнения.

import Ordering.Implicits._ 
class SortAlgo[T: Ordering] { 
    def insert(x:T, xs:List[T]): List[T]= xs match { 
    case Nil=> List(x) 
    case y::ys=> 
     if(x<y) x::xs 
     else y::insert(x,ys) 
    } 

    def isort(xs:List[T]): List[T]=xs match { 
    case Nil => Nil 
    case x :: xs1 => insert(x, isort(xs1)) 
    } 
} 
2

x и y имеют тип T, но ничто не указывает, что T имеет < метод.

Два варианта:

1 - Требовать T расширяет Ordered[T]:

def insert[T <: Ordered[T]](x:T, xs:List[T]): List[T] = ... 

2 - При условии сохранения Ordering:

def insert[T](x: T, xs: List[T])(ordering: Ordering[T]): List[T] = { 
    case Nil => List(x) 
    case y::ys => 
    if (ordering.compare(x, y) < 0) => x::xs 
    else y::insert(x, ys) 
} 

Вы можете в ordering неявной, так что вы можете создать неявный объект, расширяющийся Ordering[T].

Смежные вопросы