Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# F语言中的引语与模式匹配#_F#_Pattern Matching_Quotations_Ms Solver Foundation - Fatal编程技术网

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"