Ответ Кейта (kvb) правильный - вы можете использовать параметризованные компоновщики вычислений.Синтаксис выражений вычислений:
<expr> { <cexpr> }
Итак, конструктор может быть создан любым выражением.Обычно это какое-то значение (например, async
), но это может быть вызов функции или даже вызов конструктора.При его использовании вы обычно определяете параметризованный построитель и затем передаете аргумент в конструктор, используя функцию (как подсказывает @kvb).
Я действительно написал пример этого, не так давно, такЯ могу поделиться примером, где - я думаю - это весьма полезно.Вы можете найти его в F # snippets: http://fssnip.net/4z
В этом примере создается «специальный» конструктор асинхронных вычислений для ASP.NET MVC, который ведет себя так же, как стандартный async
.Единственное отличие состоит в том, что он добавляет Run
член, который использует AsyncManager
(предоставленный ASP.NET) для выполнения рабочего процесса.
Вот некоторые важные части из фрагмента:
/// A computation builder that is almost the same as stnadard F# 'async'.
/// The differnece is that it takes an ASP.NET MVC 'AsyncManager' as an
/// argumnet and implements 'Run' opration, so that the workflow is
/// automatically executed after it is created (using the AsyncManager)
type AsyncActionBuilder(asyncMgr:Async.AsyncManager) =
// (Omitted: Lots of boilerplate code)
/// Run the workflow automatically using ASP.NET AsyncManager
member x.Run(workflow) =
// Use 'asyncMgr' to execute the 'workflow'
Фрагмент оборачивает конструкцию в базовом классе, но вы можете определить функцию:
let asyncAction mgr = new AsyncActionBuilder(mgr)
А затем используйте его для определения асинхронного действия в ASP.NET MVC:
member x.LengthAsync(url:string) = asyncAction x.AsyncManager {
let wc = new WebClient()
let! html = wc.AsyncDownloadString(url)
return html.Length }