Как я могу пойти о построении рекурсивного построителя выражений вычислений - PullRequest
0 голосов
/ 12 июня 2011

То, что я хотел бы сделать, это иметь функцию, в которую я могу многократно передавать функцию преобразования и получать комбинированное преобразование, функция преобразования будет иметь вид 'a ->' b

, т.е.чем составить фиксированный рабочий процесс, как это:

let input = async{ let! transform1 = transformAB input
                   let! transform2 = transformBC transform1
                   let! transform3 = transformCD transform2 
                   return! transform3 }

Я хотел бы иметь возможность сделать это:

let combined = buildTransform(transform1).Next(transform2).Next(transform3)

Так что тогда я мог бы просто позвонить комбинированный ввод чтобы получить результаты рабочего процесса.

Возможно ли это без ограничения значения или компилятора, ограничивающего все преобразователи одним и тем же типом?

1 Ответ

3 голосов
/ 12 июня 2011

Я не совсем уверен, что получил ваш вопрос, вам нужно что-то похожее на оператор (>>), примененный к Async?

open System

let f1 a = async { return Int32.Parse a }
let f2 a = async { return a = 10 }
let f3 a = async { return (not a).ToString() }

// async defined via workflow syntax
// string -> Async<string>
let result a = async {
    let! x1 = f1 a
    let! x2 = f2 x1
    let! x3 = f3 x2
    return x3
    }

Async.RunSynchronously (result "10")
|> printfn "%s"

let (|>>) f1 f2 arg = async {
    let! r = f1 arg
    return! f2 r
    }

// async defined with 'combine' operator
// string -> Async<string>
let combined = f1 |>> f2 |>> f3
Async.RunSynchronously (combined "10")
|> printfn "%s"    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...