Functional programming 给出了几个选项<';a>;值,是否存在链接多个';a->';b->';b功能?
我有一系列函数来更新一个不可变的实体 我有一系列相应的Functional programming 给出了几个选项<';a>;值,是否存在链接多个';a->';b->';b功能?,functional-programming,f#,Functional Programming,F#,我有一系列函数来更新一个不可变的实体 我有一系列相应的'arg选项参数,如果参数是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 -
'arg选项
参数,如果参数是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
我喜欢它有多简单,但我自己开发的函数解决方案通常都是这样(特别是当泛型函数比我提出的参数名称更泛型时),我觉得这只是一个更一般的函数概念的特例——我可以使用一些现有的抽象来执行相同的任务。因此,我想知道:
- 这是公认的功能模式吗?如果有,它有名字吗?我能在什么地方读到更多关于它的信息吗
- 如果没有,是否有一个(希望同样简单)的替代方案可以使用“众所周知的”功能抽象/模式来实现同样的功能
- 这只是(或者更准确地说是在这种情况下)。褶皱通常被称为变形
let updateWebhook callbackUrl authHeader webhook =
webhook
|> Option.foldBack Webhook.setCallbackUrl callbackUrl
|> Option.foldBack Webhook.setAuthHeader authHeader
那么,@Lee,在选项的情况下,
fold
和foldBack
之间有什么区别?我知道列表是折叠的方向(左对右)。但是它对选项有什么不同呢?@melston-它实际上没有什么不同,因为一个选项中只有1或0项,但是参数的顺序在fold
vsfoldBack
:选项。fold
是('State->'t->'State)中是不同的->“状态->“T选项->”状态
和选项。折叠式
是('T->“状态->”状态)->“T选项->”状态
。这些镜像了List.fold
和List.foldBack
的类型。谢谢,@Lee。这是有道理的。我想我是被这个名字吓了一跳,因为在F#之前我见过的大多数语言都使用foldLeft
和foldRight
(文件夹函数的参数顺序颠倒)。我看到了foldBack
,想知道是否还有其他事情发生。