假设有一个type r = {A : int; B : string; C : int; D : string}
和一些值:
let aOptional : int option = ...
let bOptional : string option = ...
let cOptional : int option = ...
let dOptional : string option = ...
How can r optional
可以用它们优雅地构建(没有嵌套的案例等)?
顺便说一句,这是如何在 haskell 中完成的Control.Applicative http://hackage.haskell.org/package/base-4.6.0.0/docs/Control-Applicative.html:
data R = R { a :: Integer, b :: String, c :: Integer, d :: String}
R <$> aOptional <*> bOptional <*> cOptional <*> dOptional :: Maybe R
在 fsharp 中寻找等效的东西。
我知道的唯一方法(使用应用程序)是创建一个函数来构造记录:
let r a b c d = {A = a; B = b; C = c; D = d}
然后你可以这样做:
> r </map/> aOptional <*> bOptional <*> cOptional <*> dOptional ;;
val it : R option
您可以定义map
and <*>
你自己,但如果你想要一个通用的实现,请尝试使用该代码F#+ https://github.com/gmpl/FSharpPlus或者如果你想使用控制系统 https://github.com/gmpl/FsControl直接可以这样写代码:
#r "FsControl.Core.dll"
open FsControl.Operators
let (</) = (|>)
let (/>) f x y = f y x
// Sample code
type R = {A : int; B : string; C : int; D : string}
let r a b c d = {A = a; B = b; C = c; D = d}
let aOptional = Some 0
let bOptional = Some ""
let cOptional = Some 1
let dOptional = Some "some string"
r </map/> aOptional <*> bOptional <*> cOptional <*> dOptional
// val it : R option = Some {A = 0; B = ""; C = 1; D = "some string";}
UPDATE: Nuget 包 https://www.nuget.org/packages/FsControl/现在可用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)