나중에 계산식의 표준 방법 중 하나에서 사용할 수있는 계산식에 메서드 또는 독립 실행 형 함수를 만들 수 있습니까?계산 식의 매개 변수에 액세스 할 수 있습니까?
나는 이런 식으로 뭔가 싶어 :
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가 환경 인 독자 모나드입니다. 이 경우 빌더의 인수가 아니라 계산을 통해 스레드 된 상태의 일부가됩니다. 그런 다음 더 이상 빌더에 묶이지 않고 외부에서 HttpContext를 가져올 수 있으므로 get_int 등을 별도의 모듈에 가질 수 있습니다. – scrwtp
@scrwtp - 오히려 이것이 Maybe 모나드라고 생각했습니다. HttpContext 객체에서 * 및 * 파싱 값을 읽는 중입니다. 그러나 이러한 작업 중 하나 또는 둘 모두가 실패 할 수 있습니다 (예 : "id"라는 값을 읽었지만 int로 파싱되지 않음). 예제 코드는 약간 단순화되었습니다. 'Option' 대신'ReadAttempt' 타입을 사용합니다. <'t> = 성공 't | 실패한 문자열'. –
좋습니다. 나는 내 생각의 일부를 답으로 추가 할 것이다. – scrwtp