2017-07-21 8 views
0

lstを繰り返し実行し、各要素を面白くしたり、再帰的に新しい関数を返す関数(lst:List(T)、fun:)を書く方法はありますか?関数アプリケーションの結果が次のようになるまでこれを行います:Future [T]、関数型ではありませんか?タイプ/結果が必要なまでの部分的なアプリケーションの適用

funは、このような

何かカリー化関数です。

def partialAppRec(lst : List[T], fun: ?) = 
//pardon the non-exhaustive pattern match 
    lst match { 
    case x::xs => 
    val test = fun(x) 
    if (test: Future[T]) return test 
    partialAppRec(xs, (fun(x) _)) 
} 

しかし、どんなタイプが楽しいですか?とにかく楽しいと言ってもらえますか?それは、それが取ることができるパラメータを無視します。可変パラメータのfunを取り込めますが、それはFuture[T]を返します。 f : ..=>Future[T]しかし、私はこのようなものが存在するかどうかはわかりません。

ヒント/ご提案はありますか?ありがとう。

+0

'List [T]'の要素にfunを適用したい場合、関数がとりうる唯一のパラメータは 'T'です。 また、スカラで 'return'を使わないでください、(ほとんど)常に間違ったことです。 – Dima

+0

私は何をしたいのか正確ではありません。それはちょうどlst.map(...)になります。これは楽しいことのargsを表現し、楽しいことをしたいと思っている最初のものを使用しています(elt1、elt2、...、elt n) – Jay

+0

私はまず 'fun'のタイプについて考えていました。私はあなたがADT、あるいはちょうど普通の 'Option [Future [T]]'を返すように楽しいと思っています。 – Reactormonk

答えて

1

Either

trait Fun[T] extends Function[T, Either[Fun[T], Future[T]]] 
object Fun { 
    def apply[T](f: T => Either[Fun[T], Future[T]]) = 
    new Fun[T] { def apply(t: T) = f(t) } 
} 

def partialAppRec[T](lst: List[T], fun: Fun[T]): Future[T] = lst match { 
    case Nil => ??? 
    case head :: tail => fun(head) match { 
    case Right(fu) => fu 
    case Left(f) => partialAppRec(tail, f) 
    } 
} 
+0

これはうまくいくように見えますが、atmをtypecheckしていないようです。 'アプリケーションはパラメータを取っていません 'ということは、楽しいことを正しく認識していないことです。 'case head :: tail => fun(head)match {' – Jay

+0

@Jay私はいくつかのタイプミスを修正しました。コンパイルする必要があります。 – Dima

関連する問題