注意:我们不能在模式匹配中放入lambda 表达式

以下代码在VS2012中不能通过编译,你知道么?知道为什么么?

 1 let f0 x = x % 2 = 0
 2 let f1 x = x % 2 <> 0
 3 
 4 let ( | Even | _ | ) f (x:int) = if f(x) then Some(Math.Sign(x)) else None
 5 let ( | Odd | _ | ) f (x:int) = if f(x) then Some(Math.Sign(x)) else None
 6 
 7 let f (x:int) = 
 8    match x with 
 9      | Even (fun x -> x % 2 = 0) sign-> sprintf "even sign=%d" sign
10      | Odd f1 sign-> sprintf "odd sign=%d" sign

编译器会在关键字”fun”那里报一个错误,抱怨“Unexpected keyword ‘fun’ in pattern. Expected ‘)’ or other token” 。见如下截图:

你有想过这个编译错误仅仅是因为我们不能在模式里面放入lambda表达式么?如果是这样的话,那么恭喜你,你猜对了!J

似乎这个错误信息会误导我们去写很多的“)”或者其它的一些疯狂的绕过去的举措。如果编译器直接告诉用户我们不支持它那就好了。不管怎样,如果你知道了这个点,那么我们就不会陷入困境了。

posted @ 2012-06-08 17:30  tryfsharp  阅读(350)  评论(1编辑  收藏  举报