14

全順序で任意のScalaタイプで機能する関数を作成したい(つまり、「<」を使用できる)。そのための構文は何ですか?私が思いついた最高のものは

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

しかし、REPLから使用しようとすると、それは機能しません。

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))

基本的に、私はこのHaskellコードと同等のものが欲しいと信じています:

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

Debianシステムでscala2.7.3を使用しています。

何が欠けているのか、どこにあるのか?

4

1 に答える 1

25

Scala での Haskell の型クラスに相当するものは、暗黙型を介して行われます。あなたがやりたいことをする2つの方法があります

1つ目はビューの境界です

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

2 つ目は、暗黙的なパラメーターを使用したものです。

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

前者は後者のシンタックス シュガーです。後者の方が柔軟性が高くなります。

于 2009-03-27T22:21:27.187 に答える