wordpress主题网店,咸阳seo培训,个人怎么做优惠券网站,30g月流量网站F#提供了一个叫活动模式的有趣功能。它把输入的数据转换成其他不同的东西。 一个有趣的使用实例就是代替枚举。但我编程枚举的时候#xff0c;我总不高兴去链接枚举项到它的定义。例如#xff0c;下面的枚举定义了 数字枚举#xff0c; enum Numbers{Odd,Even,}…F#提供了一个叫活动模式的有趣功能。它把输入的数据转换成其他不同的东西。 一个有趣的使用实例就是代替枚举。但我编程枚举的时候我总不高兴去链接枚举项到它的定义。例如下面的枚举定义了 数字枚举 enum Numbers{Odd,Even,} 但是它没有说明什么是Odd什么是Even。我试着使用特性或简单的注释但是我真正想得到的是在F#中见到枚举项就获取定义。当我看见活动模式的时候我的眼睛一下亮起来了。你真的可以使用非分部模式来解决这个问题但是你不能放多余8项所以我选择使用分部模式为了我的系统在将来可以容易的扩展。 let ( | Even | _ | ) x if x % 2 0then Some() else Nonelet( | Odd | _ | ) x ifx % 2 0 then Some() else Noneletf x matchxwith| Even - even| Odd - oddletr f 2 //r even 上面的例子仅仅返回Some()或者None。如果想返回更有趣的东西 let f0 x x % 2 0letf1 x x % 2 0let ( | Even | _ | ) (x:int) iff0(x) then Some(signx)else Nonelet ( | Odd | _ | ) (x:int) if f1(x)then Some(signx)else Nonelet f (x:int) match x with| Even sign- sprintf even sign%d sign| Odd sign - sprintf odd sign%d signlet r f 2 注意高亮sign保存了返回结果 Math.Sign(x)。 我想尝试的最后一件事情是用 Even(或Odd)模式传递给函数。新的代码是: let f0 x x % 2 0let f1 x x % 2 0let ( | Even | _ | ) f (x:int) if f(x) thenSome(sign x) else Nonelet ( | Odd | _ | ) f (x:int) if f(x)then Some(signx)else Nonelet f (x:int) match x with| Even f0 (* you can think x passed in here *) sign - sprintf even sign%dsign| Odd f1 (* you can think x passed in here *) sign- sprintf odd sign%dsignlet r f 2 请注意如果你像下面这样取函数f为第二个参数来定义模式Even。 let ( | Even | _ | ) (x:int) f if f(x)then Some(Math.Sign(x))else None 将会报一个错误。所以当你定义模式的时候参数顺序真的很重要。转载于:https://www.cnblogs.com/xiwang/articles/2583976.html