F# 计算工作流问题

F# 计算工作流问题,f#,computation-expression,F#,Computation Expression,试图遵循专家手册中的示例,但工作流有问题……代码如下: type Attempt<'a> = option<'a> let succeed x = Some (x) let fail = None let bind p rest = match p with | None -> fail | Some r -> rest r let delay f = f() type AttemptBuilder

试图遵循专家手册中的示例,但工作流有问题……代码如下:

type Attempt<'a> = option<'a>
let succeed x    = Some (x)
let fail         = None 

let bind p rest  = 
    match p with 
    | None -> fail 
    | Some r -> rest r

let delay f = f()

type AttemptBuilder() = 

    member b.Return (x) = succeed x
    member b.Bind (p, rest) = bind p rest
    member b.Delay (f) = delay f
    member b.Let (p, rest):Attempt<'a> = rest p  //'
    member b.ReturnFrom x = x


// using it: 
let attempt = new AttemptBuilder()

let test foo = 
    attempt {
        if not foo then return! fail else return foo
    }

let check () = 
    attempt {

        let! n1 = test true
        let! n2 = test false
        let! n3 = test true
        let foo = n1,n2,n3
        return foo
    }
let foo = check ()
类型尝试
让成功x=一些(x)
让失败=没有
设bind p rest=
配p
|无->失败
|一些r->rest r
设延迟f=f()
键入AttemptBuilder()
成员b.返回(x)=成功x
成员b.Bind(p,rest)=Bind p rest
成员b.延迟(f)=延迟f

成员b.Let(p,rest):尝试这只是因为
None
在运行时实际表示为
null
(请参阅上的备注)。另外,请注意,您可以添加

member x.Zero() = fail
到构建器,然后您可以将测试作为

let test x = attempt { if x then return foo }

这对我来说有点干净。

foo
实际上是
None
,只是
None
在运行时表示为
null
。啊,你说得对!事实上,当我为测试foo添加一个匹配None时,它实际上是None,但是当我在那里放置一个断点时,它显示为null,即使在fsi会话中,当我对它求值时,它打印为None。。。没有空值的语言就到此为止:)。谢谢你的回答,布莱恩也一样。