加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何使用长参数列表进行无点样式

发布时间:2020-12-16 19:11:48 所属栏目:安全 来源:网络整理
导读:我有一个创建Async工作流的函数,以及以咖喱风格获取10个参数的函数.例如 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 (cr
我有一个创建Async工作流的函数,以及以咖喱风格获取10个参数的函数.例如

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)

(我将Haskell和Scala添加到这个问题中,即使代码本身是F#,我真正想要的是如何做这种currying,这适用于任何;我认为Haskell或Scala的答案很容易便携式到F#,很可能被标记为正确的答案).

注意合理地表明没有一个简单的解决方案也可以得到赏金.

更新geesh我不会给出一个与问题争论的答案而不是回答100分,即使它是最高的投票,所以这里:

我有一个创建Async工作流的函数,以及以咖喱风格获取4个参数的函数.例如

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相对的泛型args.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读