0

对于给定的函数调用 f,带有参数 a、b 和 c,它使用函数 h 和 i 调用函数 g 来构建参数,我可以说:

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 变为 build )强制执行此操作:

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

to(鉴于 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 => Cwith之间来回切换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如果你想真正成为三个单独的字符串参数,然后在途中取消curry 。

于 2012-12-18T20:12:55.637 回答