给定几个Option <'a>值,是否有一个众所周知的模式来链接多个'a->'b->'b函数?

cme*_*ren 4 f# functional-programming

我有一系列'arg -> 'entity -> 'entity更新不可变实体的功能。

我有一系列相应的'arg option参数,如果参数是Some,则应调用相应的update函数。

我目前已经这样实现:

// General utility function
// ('a -> 'b -> 'b) -> 'a option -> 'b -> 'b
let ifSome f argOpt entity =
  match argOpt with
  | Some arg -> f arg entity
  | None -> entity


// Function that accepts several option parameters
// (callbackUrl and authHeader are wrapped in option)
let updateWebhook callbackUrl authHeader webhook =
   webhook
   |> ifSome Webhook.setCallbackUrl callbackUrl
   |> ifSome Webhook.setAuthHeader authHeader
Run Code Online (Sandbox Code Playgroud)

我喜欢它的简单性,但是就像我自己开发的函数解决方案一样(特别是当泛型函数比我想出的参数名更通用时),我感觉这只是一个特例一个更通用的功能概念-我可以使用一些现有的抽象来执行相同的任务。因此,我想知道:

  • 这是公认的功能模式吗?如果是这样,它有名字吗,我可以在某个地方阅读更多有关它的信息吗?
  • 如果不是,是否存在(希望类似地简单)使用“众所周知”的功能抽象/模式实现相同功能的替代方法?

Lee*_*Lee 5

这仅仅是Option.fold(或者在这种情况下更准确地说Option.foldBack)。褶皱通常被称为变形。

let updateWebhook callbackUrl authHeader webhook =
   webhook
   |> Option.foldBack Webhook.setCallbackUrl callbackUrl
   |> Option.foldBack Webhook.setAuthHeader authHeader
Run Code Online (Sandbox Code Playgroud)