6

我有一个带有两个参数的函数,例如:

let f a b = a = b

然后我有第二个函数返回一个元组:

let g = (a, b)

我想将元组中的 a 和 b 作为参数从 g 传递给 f 在一行中。我可以在两个语句中做到这一点,但我想这样做的原因是我的调用函数执行 or 并且我宁愿不调用 f 除非第一种情况为假,以节省不必要的处理。

let calling =
  someboolean || 
  f g // want to split result of g to parameters for f without calling g twice

关于如何做到这一点的任何提示?我知道我可以让 f 取一个元组,但我想保留柯里化的选项。

我希望我解释得足够好。:)

4

4 回答 4

9

你也可以这样做:

let calling = someBoolean || g ||> f

因为:

(||>) : ('a * 'b -> ('a -> 'b -> 'c) -> 'c)

(同样地(|||>) : ('a * 'b * 'c -> ('a -> 'b -> 'c -> 'd) -> 'd)

于 2013-06-07T11:57:15.850 回答
5

您可以定义一个函数,将 curried 函数转换为一个接受 pair 参数的函数:

uncurry f (a, b) = f a b

let calling = someBoolean || (uncurry f) g
于 2013-06-07T10:46:14.710 回答
3

您可以从内联元组中提取,您仍然可以从短路中受益。

let calling = someBoolean || let a,b = g in f a b
于 2013-06-07T10:58:20.077 回答
2

如前所述,您可以定义uncurry组合器以将采用两个参数的函数转换为采用元组的函数。

但是我建议不要这样做——这种编程风格在 F# 中并不是真正地道的(不像在 Haskell 中),我认为它使代码难以阅读、调试和维护。

那么,该怎么做呢?

  • 如果这两个值在逻辑上属于一起(表示代码中其他地方使用的某个实体),则f也更改为采用元组。

  • 如果它们只是两个值,则使用let和模式匹配来分解元组。这会更长,但您必须为组件命名,这将提高可读性。

在您的示例g中实际上是一个值,因此您可以只写:

let someThing, otherThing = g
boolThing || (f someThing otherThing)
于 2013-06-07T12:05:19.027 回答