我有一系列功能'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
我喜欢它的简单性,但是就像我自己开发的函数解决方案一样(特别是当泛型函数比我想出的参数名更通用时),我感到这仅仅是一个更通用的功能概念的特例-我可以使用一些现有的抽象来执行相同的任务。因此,我想知道:
答案 0 :(得分:5)
这只是Option.fold
(或更确切地说,在这种情况下为Option.foldBack
)。褶皱通常被称为变态现象。
let updateWebhook callbackUrl authHeader webhook =
webhook
|> Option.foldBack Webhook.setCallbackUrl callbackUrl
|> Option.foldBack Webhook.setAuthHeader authHeader