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

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

let f0 x = x % 2 = 0

let f1 x = x % 2 <> 0

 

let ( | Even | _ | ) f (x:int) = if f(x) thenSome(Math.Sign(x)) else None

let ( | Odd | _ | ) f (x:int) = if f(x) thenSome(Math.Sign(x)) else None

 

let f (x:int) =

   match x with

     |Even (fun x ->x % 2 = 0) sign-> sprintf "even sign=%d" sign

     | Odd f1 sign-> sprintf "odd sign=%d" sign

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值