2009-03-27 2 views
14

모든 스칼라 유형에서 작동하는 함수를 전체 정렬로 쓰고 싶습니다. 즉, '<'을 사용할 수 있습니다. 그 문법은 무엇입니까? 기본적으로Ordered [A]의 하위 유형을 취하는 함수의 스칼라 구문은 무엇입니까?

scala> lessThan(1, 2) 
<console>:8: error: inferred type arguments [Int] do not conform to method lessThan's type parameter bounds [T <: Ordered[T]] 
     lessThan(1, 2) 
    ^

scala> import runtime._ 
import runtime._ 

scala> lessThan(new RichInt(1), new RichInt(2)) 
<console>:8: error: inferred type arguments [scala.runtime.RichInt] do not conform to method lessThan's type parameter bounds [T <: Ordered[T]] 
     lessThan(new RichInt(1), new RichInt(2)) 

, 나는이 동등한를 원하는 생각 : 내가 함께 왔어요 가장 좋은 내가 REPL에서 그것을 사용하려고 할 때,하지만 작동하지 않습니다

def lessThan[T <: Ordered[T]](x: T, Y: T) = x < y 

입니다 하스켈 코드 :

lessThan :: (Ord a) => a -> a -> Bool 
lessThan x y = x < y 

데비안 시스템에서는 scala 2.7.3을 사용하고 있습니다.

무엇이 누락 되었습니까?

답변

24

스칼라에서 하스켈의 타입 클래스에 해당하는 것은 implicits를 통해 수행됩니다.

scala> def lessThan[T <% Ordered[T]](x : T, y : T) = x < y 
lessThan: [T](T,T)(implicit (T) => Ordered[T])Boolean 

scala> lessThan(1,2) 
res0: Boolean = true 

두 번째는 암시 적 매개 변수

scala> def lessThan[T](x : T, y : T)(implicit f : T => Ordered[T]) = x < y  
lessThan: [T](T,T)(implicit (T) => Ordered[T])Boolean 

scala> lessThan(4,3) 
res1: Boolean = false 

이전에 당신이

첫 번째를하고 싶은 일을하는 방법은 두 가지가 있습니다보기 경계로되어 나중에 구문 설탕입니다. 나중에는 더 많은 융통성을 허용합니다.

+0

암시 적으로 암시 적으로 명시 적으로 매개 변수로 가져와야하는 이유는 무엇입니까? scala-runtime이 T를 암시 적으로 Ordered [T]로 변환하는 방법을 알고있는 경우 암시 적 매개 변수를 나열해야하는 이유는 무엇입니까? 감사! – shj

+2

먼저 T를 Ordered [T]로 변환 할 수 없습니다. 예를 들어, 순서를 정의하십시오 (Int => Int). 둘째, 변환이 가능한 경우 런타임은 변환 방법을 알지 못합니다. 대신 컴파일러는 런타임에 변환을 수행하는 함수를 삽입하는 방법을 알고 있습니다. –

+0

첫 번째 메소드가 더 이상 사용되지 않는 것처럼 보입니다. [SI-7629] (https://issues.scala-lang.org/browse/SI-7629) –

관련 문제