Можно ли создавать методы или автономные функции в выражении вычисления, которое впоследствии может использоваться одним из канонических методов выражения вычисления?Могу ли я получить доступ к параметрам выражения вычислений?
Я хочу что-то вроде этого:
type FormletBuilder(ctx : HttpContext) =
let get_int =
match Int32.TryParse (ctx.Request.["foo"]) with
| (true, n) -> Some n
| _ -> None
//similar definitions for get_date, get_non_empty_str, etc...
member x.Bind (read : 'a option, f : 'a -> option 'a) =
match read with
| Some x -> f(x)
| None -> None
member x.Return (obj) = Some obj
member x.Zero() = None
let person = formlet ctx {
let! id = get_int "id"
let! name = get_non_empty_str "fullname"
return Person(id, name)
}
Но компилятор жалуется, что get_int
не определен.
Что вы на самом деле пытаетесь сделать здесь? Мне кажется, что вы хотите иметь монаду-читателю, а HttpContext - это среда. В этом случае это не будет аргумент строителя, а часть состояния, которое выполняется через вычисление. Тогда вы можете получить свой get_int и т. Д. В отдельном модуле, так как они больше не будут привязаны к строителю, но будут получать HttpContext извне. – scrwtp
@scrwtp - Я скорее подумал, что это была монашка Maybe. Идея состоит в том, что мы читаем значения * и * для разбора значений из объекта HttpContext, но одна или обе эти операции могут потерпеть неудачу (например, мы читаем значение, называемое «id», но не обрабатываем как int). Примерный код немного упрощен; вместо 'Option', мой фактический код использует тип' ReadAttempt <'t> = Успех 't | Ошибка строки. –
Хорошо, справедливо. Я добавлю некоторые из своих мыслей в качестве ответа. – scrwtp