13
다음은 C#으로 수행 할 수있는 작업 -F # lambda를 사용하여 Linq 표현식 트리를 어떻게 만듭니 까?
var two = 2;
System.Linq.Expressions.Expression<System.Func<int, int>> expr = x => x * two;
expr.Compile().Invoke(4); // returns 8
내가 F 번호의 정확한 동등을하고 싶습니다.
let two = 2
let expr = (fun x -> x * two) : System.Linq.Expressions.Expression<System.Func<int, int>>
expr.Compile().Invoke(4) // desired to return 8
을 아마도 예상, 컴파일 다음과 같은 오류와 함께 라인이 실패 - - 당신이 F 번호 견적을 사용하지 않도록하려는 이유를 잘 모르겠어요
"This function takes too many arguments, or is used in a context where a function is not expected."
let expr = (fun x -> x * two) : System.Linq.Expressions.Expression<System.Func<int, int>>
^^^^^^^^^^^^^^^^
답장을 보내 주셔서 감사합니다. 그것은 작지만 작은 비트로 보이지만 멋지 네요. 그러나 질문에 답하기 위해 AFAIK는 어휘 환경 (예 :'two')에서 변수를 포착 할 수 없기 때문에 코드 인용을 피하고 싶었습니다. 변하기 쉬운). 비록 그것이 틀린 경우에, 그러나 저를 정정하십시오! –
두 경우 모두 동일하게 작동합니다. 로컬'let' 바운드 변수는 따옴표에 포착되지 않습니다. 변수의 값만 포함됩니다. 모듈에 의해 공개 된 공개 변수는 참조로 캡처됩니다 (속성 게터로). –
편집까지 따라야합니다. 표현 트리 자체가 주변 컨텍스트에서 가져온 참조를 변경하는 경우 예상대로 작동하지 않습니다. 내가 사용하려고하는 람다 중 일부는 더 넓은 프로그램 상태로 돌연변이를 일으킬 수 있습니다. –