Проблема с вычислительным процессом - PullRequest
3 голосов
/ 17 ноября 2010

пытается следовать примеру в книге экспертов f # и имеет проблемы с рабочими процессами ... код выглядит следующим образом:

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 ()

Проблема в том, что когда все значения равны true, я получаю, как и ожидалось, Some (true, true, true), но если одно из переданных значений равно false, foo равно null (!) Кто-нибудь?

спасибо!

1 Ответ

3 голосов
/ 17 ноября 2010

Это просто потому, что None фактически представлен как null во время выполнения (см. Примечания на странице Option<'T> в MSDN ).Также обратите внимание, что вы можете добавить

member x.Zero() = fail

к вашему сборщику, а затем написать тест как

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

, что немного чище для моих глаз.

...