F# F语言中的引语与模式匹配#
在新的控制台应用程序中,仅粘贴以下代码就会导致异常“参数不是可识别的方法名”F# F语言中的引语与模式匹配#,f#,pattern-matching,quotations,ms-solver-foundation,F#,Pattern Matching,Quotations,Ms Solver Foundation,在新的控制台应用程序中,仅粘贴以下代码就会导致异常“参数不是可识别的方法名” 以下代码是否适用于您的安装 小丑:你知道为什么它在我身上不起作用吗 //了解更多关于F#at的信息http://fsharp.net //有关更多帮助,请参阅“F#Tutorial”项目。 让somefunction1参数=() 让somefunction2()=() 开放式报价 let test()= 设d= 设e= 匹配 |specificall(a、b、c)->printfn“somefunction” |
- 以下代码是否适用于您的安装
- 小丑:你知道为什么它在我身上不起作用吗
//了解更多关于F#at的信息http://fsharp.net
//有关更多帮助,请参阅“F#Tutorial”项目。
让somefunction1参数=()
让somefunction2()=()
开放式报价
let test()=
设d=
设e=
匹配
|specificall(a、b、c)->printfn“somefunction”
|_uu->printfn“其他内容”
匹配
|specificall(a、b、c)->printfn“somefunction”
|_uu->printfn“其他内容”
匹配
|specificall(a、b、c)->printfn“somefunction”
|_uu->printfn“其他内容”
//此处失败,说明“参数不是可识别的方法名”
匹配
|specificall(a、b、c)->printfn“somefunction”
|_uu->printfn“其他内容”
[]
让主argv=
测试()
printfn“%A”argv
0//返回整数退出代码
查看编译器中定义的活动模式SpecificCall的定义,我发现:
[<CompiledName("SpecificCallPattern")>]
let (|SpecificCall|_|) templateParameter =
// Note: precomputation
match templateParameter with
| (Lambdas(_,Call(_,minfo1,_)) | Call(_,minfo1,_)) ->
let isg1 = minfo1.IsGenericMethod
let gmd = if isg1 then minfo1.GetGenericMethodDefinition() else null
// end-of-precomputation
(fun tm ->
match tm with
| Call(obj,minfo2,args)
#if FX_NO_REFLECTION_METADATA_TOKENS
when (minfo1.MethodHandle = minfo2.MethodHandle &&
#else
when (minfo1.MetadataToken = minfo2.MetadataToken &&
#endif
if isg1 then
minfo2.IsGenericMethod && gmd = minfo2.GetGenericMethodDefinition()
else
minfo1 = minfo2) ->
Some(obj,(minfo2.GetGenericArguments() |> Array.toList),args)
| _ -> None)
| _ ->
invalidArg "templateParameter" (SR.GetString(SR.QunrecognizedMethodCall))
[]
let(| specificall | |)templateParameter=
//注:预计算
将templateParameter与
|(Lambdas(,Call(,minfo1,))| Call(,minfo1,))->
让isg1=minfo1.IsGenericMethod
让gmd=if为isg1,则minfo1.GetGenericMethodDefinition()否则为null
//预计算结束
(趣味tm->
匹配
|呼叫(obj、minfo2、args)
#如果FX\u无\u反射\u元数据\u令牌
当(minfo1.MethodHandle=minfo2.MethodHandle)&&
#否则
当(minfo1.MetadataToken=minfo2.MetadataToken)&&
#恩迪夫
如果是G1,那么
minfo2.IsGenericMethod&&gmd=minfo2.GetGenericMethodDefinition()
其他的
minfo1=minfo2)->
一些(obj,(minfo2.GetGenericArguments()|>Array.toList),args)
|(无)
| _ ->
invalidArg“templateParameter”(SR.GetString(SR.qunrecognedMethodCall))
在我看来,这很好……您是否可能以某种方式隐藏了var
的原始定义?例如,以下自包含的示例对我来说很好:
let var<'a>() = Unchecked.defaultof<'a>
match <@ var<int>() @> with
| Quotations.DerivedPatterns.SpecificCall <@ var @> (obj,_,[]) ->
printfn "var"
| _ -> printfn "something else"
let var
匹配
|Quotences.DerivedPatterns.SpecificCall(obj,,[])->
printfn“var”
|_uu->printfn“其他内容”
我应该在消息中说,我试图执行与您的代码类似的操作,但出现了相同的错误。从您的示例中复制/粘贴也会出现相同的错误。我将尝试在不同的上下文中执行该操作(clean project、fsharp版本等)要找到答案,这是令人费解的。对我来说,将编辑中的代码粘贴到新项目中可以正常工作。我正在运行VS2012。当我在Visual Studio 2012中粘贴编辑中的代码#2时,它对我来说可以正常工作。你能在某个地方共享编译后的程序集吗,可能有一些不同……还有,F#(等等)的版本是什么你在使用吗?这很奇怪。我们如何跟踪所有这些信息?融合日志?不确定,但如果你从你的机器上共享编译的exe
,我可以试着运行它,看看我们正在使用的编译器或加载的FSharp.Core.dll
中是否有差异。你的编辑2示例在VS2012/.NET 4.5中对我来说很好和VS2010/.NET 4.0。您使用的是什么版本的F#/.NET framework/Visual Studio?在家中也可以使用。我在工作中使用VS2012RC/.NET 4.5。明天将尝试发布二进制文件。主页:FSharp.Core.dll v4.3.50727.0
let var<'a>() = Unchecked.defaultof<'a>
match <@ var<int>() @> with
| Quotations.DerivedPatterns.SpecificCall <@ var @> (obj,_,[]) ->
printfn "var"
| _ -> printfn "something else"