2

これは問題のコードです。説明/説明の一部が以下に含まれています

オブジェクト関数{
  インポートscala.reflect.Manifest
  プライベート変数関数:List [(Manifest [_]、Any、String)] = List()
  def add [T](desc:String、func:T)(implicit m:Manifest [T]){
    関数::=(m、func、desc)
  }

  def get [T]()(implicit m:Manifest [T]):List [(T、String)] = {
    関数flatMap{
      case(t、f、s)=> if(t <:<m)Some(f.asInstanceOf [T]、s)elseなし
    }
  }

  def getInputs [T]()(implicit m:Manifest [T]):List [(T => Any、String)] = {
  関数flatMap{
    case(t、f、s)=> if(t <:<(T => Any))Some(f.asInstanceOf [T => Any]、s)else None
    }
  }

基本的に、私の目標は、関数のリストを保持し、それらのタイプ(入力と出力)を保持し、それらが入力として受け取るものと出力として受け取るものに基づいて特定の関数を検索する機能を用意することです。ある種のモンキーパッチがなければ、これはスカラでは不可能だと私は信じ始めています。これは避けたいと思います。

4

1 に答える 1

4

形のないものでやりたいことができるはずですHLists

サンプルREPLセッション、

scala> import shapeless._
import shapeless._

scala> val f1 : String => Int = _.length
f1: String => Int = <function1>

scala> val f2 : Boolean => Boolean = !_
f2: Boolean => Boolean = <function1>

scala> val f3 : Int => String = "("+_+")"
f3: Int => String = <function1>

scala> val fs = f1 :: f2 :: f3 :: HNil
fs: (String => Int) :: (Boolean => Boolean) :: (Int => String) :: HNil =
  <function1> :: <function1> :: <function1> :: HNil

scala> val args = "foo" :: true :: 23 :: HNil
args: String :: Boolean :: Int :: HNil = foo :: true :: 23 :: HNil

scala> fs zipApply args
res0: Int :: Boolean :: String :: HNil = 3 :: false :: (23) :: HNil

HList fs関数の個々のタイプはに保持され、引数値の個々のタイプはに保持されargs、結果の要素のzipApplyタイプは対応する関数と引数のタイプによって適切に決定されることに注意してください。

于 2012-08-13T16:10:36.190 に答える