正常Option.bind函数定义如下:
// ('T -> 'U option) -> 'T option -> 'U option
let bind f x =
match x with
| None -> None
| Some x' -> f x'
Run Code Online (Sandbox Code Playgroud)
我需要一个略有不同的版本:
// ('T -> 'U -> 'U option) -> 'T option -> ('U -> 'U option)
let myBind f x =
match x with
| None -> Some
| Some x' -> f x'
Run Code Online (Sandbox Code Playgroud)
这个功能有标准名称吗?(如果不是,我会很乐意接受简明扼要的建议.)
对于感兴趣的读者,我的用例是:我有一个业务对象(比如说Order)我想应用约束(订单日期,客户等).将约束应用于例如Order具有签名的函数'Constraint -> Order -> Order option.Some order如果订单通过约束,它们将返回,None否则(因此可以使用Option.bind)组合.现在,如果约束是None,它本质上是一个无操作,Some order应该返回.'Constraint option我可以使用上面的函数(然后需要在合成期间应用)将这部分逻辑分解出来,而不是让所有约束函数都接受.
我最初称这个函数是类似的bindConstraint,但它完全是通用的,并且与我的用例无关(参考Mark Seemann 关于该主题的文章).由于它与bind我的相似性,我想知道是否有一个标准的名称.
我们来看看你的函数类型签名:
// ('T -> 'U -> 'U option) -> 'T option -> ('U -> 'U option)
Run Code Online (Sandbox Code Playgroud)
该'U -> 'U option类型实际上可以从该签名中计算出来.我们称之为那种类型'V.然后类型签名变为:
// ('T -> 'V) -> 'T option -> 'V
Run Code Online (Sandbox Code Playgroud)
看起来很相似Option.map,其签名是:
// ('T -> 'V) -> 'T option -> 'V option
Run Code Online (Sandbox Code Playgroud)
所以基本上,你的函数等效于Option.map后跟a defaultArg将其'V option转换为a 'V(如果选项是,则提供默认值None).
所以我可能会称之为defaultMap或者mapDefault.