2016-05-13 18 views
1

関数の上でmatch-caseを実行することはできますか? さまざまな種類の関数に対して動作を定義したいと考えています。スカラ:汎用関数より大文字小文字を区別する

  • f: T => Int
  • f: T => String
  • f: T => Lis[Int]
  • f: T => Boolean
  • f: T => Double
  • ...

及びこれらのそれぞれについて、O:私は次の可能性を持っていると言います私は機能を持っています。例えばInt出力用: 'DEF doThisForBoolean: def doThisForInt(f: T => Int) = { ... } このBoolean出力用val f = (input: T) => true:(F:T =>ブール値)= {...}

そこで現在、関数定義が与えられると仮定する。対応するケースをf: T => Booleanにする必要があります。

これらの機能はすべて出力タイプが異なります。あるいは、fとすれば、この関数の出力タイプを得ることができますか?

+5

あなたのユースケースは何ですか?巨大なマッチ/ケースがコードの匂いであるため、型クラスがこれに適しているように思えます。 –

+0

これらのケースのそれぞれのタイプを定義するのが好きですか? 'f:T => Int'のように、' f:T => Double'などのように? – Daniel

+1

マッチを使用したいメソッドのシグネチャは何ですか?あなたが一般的なものにしたいので、 'T => Int'を受け入れることはできませんよね?何かのように: 'def doSomething [T、R](f:T => R):??? = ??? '?何を返すべきですか? –

答えて

4

TypeTagsは、あなたが探しているものです:あなたが見ることができるように

import scala.reflect.runtime.universe._ 

def doThisForInt(f: T => Int) = ??? 

def printType[R: TypeTag](f: T => R) = typeOf[R] match { 
    case t if t =:= typeOf[Int] => 
    val toInt: (T) => Int = f.asInstanceOf[T => Int] 
    doThisForInt(toInt) 
    case t if t =:= typeOf[Double] => 
    // ... 
    case t if t =:= typeOf[List[Int]] => 
    // ... 
} 

printType((x: T) => 1) // int 
printType((x: T) => 2.0) // double 
printType((x: T) => List(2)) // list 

、それは可能ではなく、非常にエレガントでgood practicesに反しています。

instanceOfチェインは仮想メソッド(exampleを参照)で置き換えることができ、結果の関数タイプは型パラメータである可能性があります。あなたのユースケースの文脈を知らなくても、より多くのアドバイスをするのは難しいです。

関連する問題