2016-12-18 8 views
0

私は以下のScalaの機能、スカラ:算術要素でソート可能なコレクションの一般的な機能を記述する方法

def isValid(xs: Array[Int]): Boolean = { 
    val List(x, y, z) = xs.sorted.toList 
    x + y > z 
} 

を持っていると私はList[Double]に入力タイプを変更すると、これはまだ動作します。私が望むのは、これがジェネリックコレクションと、比較して追加できるすべての要素で動作することです。

EDIT:これは私が現在一般的なものです。残念ながら、私はジェネリックパラメータを指定する必要があります。

def isValid[N, S <% Seq[N]](xs: S)(implicit n: Numeric[N]): Boolean = { 
    val Seq(x, y, z) = xs.sorted 
    n.gt(n.plus(x, y), z) 
} 

// Ideally, I wouldn't have to specify the generic parameters. 
listOfArray.filter(isValid[Int, Array[Int]]) 
listOfList.filter(isValid[Double, List[Double]]) 
+0

あなたは* * "ジェネリックコレクションと仕事" とはどういう意味ですか? 'Array [T]'は一般的なコレクションです。 –

+0

@ YuvalItzchakov、私は、容器の要素だけでなく、容器そのものをパラメータ化したいと考えました。可能であれば、 'Array'と' List'と他のコンテナとの両方で動作するようにしたいと思います。 – Fysx

答えて

0

あなたはNumeric秒使用することができます

  • をあなたのコレクションに.sortedを呼び出すことができますので、それは、Orderingを拡張します
  • .plus.gtオペレーター

使用法:

scala> def isValid[N](xs: Seq[N])(implicit ev: Numeric[N]): Boolean = { 
     val x::y::z::Nil = xs.sorted.toList 
     ev.gt(ev.plus(x, y), z) // same as 'x + y > z' 
     } 
isValid: [N](xs: Seq[N])(implicit ev: Numeric[N])Boolean 

その後:

scala> isValid(List(1, 2, 3)) 
res0: Boolean = false 

scala> isValid(List(1d, 2d, 3d)) 
res1: Boolean = false 

scala> isValid(List(1L, 2L, 2L)) 
res2: Boolean = true 
+0

私は参照してください。私は 'ev'からのメソッドを使うのではなく' x + y> z'を試していました。 これは私が探していたものに近づくが、私は 'List'か' Array'の両方で呼びたいと思っているし、 'Array'から' Seq 'への暗黙の変換'。多分私は1つを提供することができます。 Lemme try。 – Fysx

0

sortedはそうあなただけのSeqを必要とすることができSeqLikeに宣言されています。

import Numeric.Implicits._ 
    import Ordering.Implicits._ 

    def isValid[N: Numeric](xs: Seq[N]): Boolean = { 
    val Seq(x, y, z) = xs.sorted 
    x + y > z 
    } 
+0

残念ながら、この場合、私は エラーが発生します:タイプの不一致。 が見つかりました:N が必要:文字列 X + Y>あなたのコードで私の例から、両方 'import'sが含ま@did Z ^ つのエラーが – Fysx

+0

を見つけましたか? – Odomontois

関連する問題