我有一个创建异步工作流的函数,以及一个接受 10 个 curry 风格参数的函数。例如
let createSequenceCore a b c d e f g h i j =
async {
...
}
我想创建另一个函数来启动该工作流程,所以我有
let startSequenceCore a b c d e f g h i j =
Async.StartImmediate (createSequenceCore a b c d e f g h i j)
有什么办法可以摆脱那些多余的参数?我试过
<<运算符,但这只能让我删除一个。
let startSequenceCore a b c d e f g h i =
Async.StartImmediate << (createSequenceCore a b c d e f g h i)
(即使代码本身是 F#,我也在这个问题中添加了 Haskell 和 Scala,因为我真正想要的是如何进行这种柯里化(Currying),这适用于任何问题;我认为 Haskell 或 Scala 的答案很容易可移植到 F# 并且很可能被标记为正确答案)。
注意 合理地表明没有简单的解决方案也可以获得赏金。
更新 天哪,我不会给与问题争论的答案而不是回答它的答案打 100 分,即使它是最高的投票,所以在这里:
我有一个创建异步工作流的函数,以及需要 的函数4 curry 风格的论点。例如
let createSequenceCore a b c d =
async {
...
}
我想创建另一个函数来启动该工作流程,所以我有
let startSequenceCore a b c d =
Async.StartImmediate (createSequenceCore a b c d)
有什么办法可以摆脱那些多余的参数?我试过
<<运算符,但这只能让我删除一个。
let startSequenceCore a b c =
Async.StartImmediate << (createSequenceCore a b c)
请您参考如下方法:
10 个参数听起来太多了……不如创建一个包含 10 个属性的记录,或者创建一个不需要所有 10 个属性的 DU?无论哪种方式,您最终都会得到一个参数,并且正常的函数组合再次按预期工作。
编辑:当你真正需要它时,你可以创建一个更强大的 << 版本。和 >>因此运营商:
let (<.<) f = (<<) (<<) (<<) f
let (<..<) f = (<<) (<<) (<.<) f
let (<...<) f = (<<) (<<) (<..<) f
let flip f a b = f b a
let (>.>) f = flip (<.<) f
let (>..>) f = flip (<..<) f
let (>...>) f = flip (<...<) f
然后你可以写:
let startSequenceCore =
Async.StartImmediate <...< createSequenceCore
或者
let startSequenceCore =
createSequenceCore >...> Async.StartImmediate
P.S.:论点
f在那里,以便类型推断推断出通用参数而不是
obj .




