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

时间:2019-05-29 12:41:37

标签: functional-programming f#

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

我有一系列相应的'arg option自变量,如果自变量是Some,则应调用相应的更新函数。

我目前是这样实现的:

// 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

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

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

1 个答案:

答案 0 :(得分:5)

这只是Option.fold(或更确切地说,在这种情况下为Option.foldBack)。褶皱通常被称为变态现象。

let updateWebhook callbackUrl authHeader webhook =
   webhook
   |> Option.foldBack Webhook.setCallbackUrl callbackUrl
   |> Option.foldBack Webhook.setAuthHeader authHeader