다음 작업을하려면 어떻게해야합니까?fsharp 인용구 Expr 목록 -> Expr 처리
Expr 목록을 받아들이고 Expr (Expr list -> Epxr)을 반환하는 함수를 만들어야합니다.
type DataObject() =
let data = System.Collections.Generic.Dictionary<int, obj>()
member this.AddValue propertyIndex value = data.Add(propertyIndex, value)
member this.GetValue propertyIndex =
match data.TryGetValue propertyIndex with
| (true, value) -> value
| (false, _) -> box "property not found"
...
(fun args ->
<@@
let data = new DataObject(values)
args |> List.iteri (fun i arg -> data.AddValue i <@@ (%%arg) : string @@>)
data
@@>)
난의 인수의 값을 추가하는 데이터 객체 유형을 만들었다. 어쨌든 I는 다른 인수를 반복 코드 그럭저럭 수 (인수한다. [0] ... 인수. [I]). 내가받는 메시지는 다음과 같습니다.
'arg'변수는 인용 부호로 묶이지 만 연결 된 표현식의 일부로 사용됩니다. 범위를 벗어날 수 있기 때문에 허용되지 않습니다.
나는 명시 적으로 인수에 액세스하는 경우 (인수를. [0], 인수. [1], ...) 솔루션은 작동하지만 곧 내가 문제로 실행 반복을 추가하려고한다. args의 목록은 길이가 유연하기 때문에 이것은 실현 가능한 해결책이 아닙니다.
다른 방법을 시도했지만 불만족 스럽습니다. 해결책이 있습니까?
type DataObject(values: obj []) =
let propertyMap = new Map<int, obj>(values |> Seq.mapi (fun i value -> (i, value)))
member this.GetValue propertyIndex : obj =
match propertyMap.TryFind propertyIndex with
| Some(value) -> value
| None -> box "property not found"
(fun args ->
let boxedArgs =
args |> List.map (fun arg ->
match arg with
| Quotations.Patterns.Var var ->
if var.Type = typeof<int> then
<@@ (box (%%arg: int)) @@>
else if var.Type = typeof<string> then
<@@ (box (%%arg: string)) @@>
else if var.Type = typeof<System.Guid> then
<@@ (box (%%arg: System.Guid)) @@>
else
failwith ("Aha: " + var.Type.ToString())
| _ -> failwith ("Unknown Expr as parameter"))
<@@ new DataObject(%%(Expr.NewArray(typeof<obj>, boxedArgs))) @@>))
그리고이 작품 :
[편집]
내 솔루션에 토마스의 피드백을 추가하는 것은 저에게이을 제공합니다! 유일한 것은 올바른 전환을 얻기 위해 if ... else 구조를 제거하고 싶다는 것입니다. 어떤 아이디어?
, 당신이 대해서 typeof'Expr.Coerce (ARG,)'와'if'를 대체 할 수 있다고 생각 - 그것은 당신에게 다른 표현'인수의 권투를 나타내는 식을 제공해야 '. –