我有一个创建异步工作流的函数,以及一个接受 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 .


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!