0

関数 h と i を使用して関数 g を呼び出して引数を構築する、引数 a、b、および c を持つ特定の関数呼び出し f について、次のように言うことができます。

f(a)(b)(c) = g( h(a)(b)(c), i(a)(b)(c) )

次のような関数を作成できることを知っています。

g'(h,i)(a)(b)(c) = g(h(a)(b)(c), i(a)(b)(c))

fができるように

f = g'(h,i)

したがって、f(a)(b)(c) を適用すると、目的の結果が得られます。

これをブルートフォースすることができます(fがビルドになる場所):

def build(a: String)(b: String)(c: String) =
  Message(convA(a)(b)(c), convB(a)(b)(c))

に (h と i が引数であることが重要ではないことを考えると、おそらくこれが切断の場所です):

def gDash = {
  a:String => b: String => c: String => Message(convA(a)(b)(c), convB(a)(b)(c))
}

def build = a:String => b:String => c:String => gDash(a,b,c)

ただし、(a、b、c) の入力全体を指定する必要があります。しかし、私はより複雑で脆弱であるべきものからより単純なものに移行しましたが、実装は実際にはより大きな混乱です! これをすべて必要としない、これを単純化する方法はありますか?

引数をタプル化すると、次のようになります。

def gDash = implicit composite:(String,String,String) => Message(convA, convB)

def convA(composite: s) => ...
def convB(composite: s) => ...

def f(a: String)(b: String)(c: String) = gDash((a,b,c))

それが実際に良いかどうかはわかりません。何かが足りないように感じます。

4

1 に答える 1

4

メソッドでは、パラメーターを明示的に指定する必要があります。タプルにはタイプ エイリアスを割り当てることができます。

type S3 = (String, String, String)

また、関数(A, B) => Cと関数の間A => B => Cを行き来することができます。curriedFunction.uncurried

これらは、関数をよりコンパクトに表現するために必要なツールを提供します。たとえば、buildformという名前のものが必要な場合String => String => String => Whateverは、

val build = ((abc: S3) => Message(convA(abc), convB(abc)).curried

gDashそして、代わりに書きたい場合は、次のMessageようにすることができます

def dash[A,B,C,D,E](g: (A,B) => C)(h: E=>A, i: E=>B): E => C = 
  (e: E) => g(h(e),i(e))

E実際に 3 つの個別の文字列パラメーターを使用する場合は、途中で uncurry を使用します。

于 2012-12-18T20:12:55.637 に答える