摘要: 你可能需要在dllImport代码中使用泛型类。但是你知道下面的代码段能通过编译么?1 open System.Runtime.InteropServices2 3 type B<'T>() = 4 member this.F() = ()5 6 module A = 7 [<DllImport("aa")>]8 extern void AA(B<int> a)答案是否定的。注意最后一行将抛出一个错误:Unexpected type application in extern declaration. Expected ' 阅读全文
posted @ 2012-06-08 17:32 tryfsharp 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 以下代码在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 -> ... 阅读全文
posted @ 2012-06-08 17:30 tryfsharp 阅读(349) 评论(1) 推荐(0) 编辑
摘要: 在现在的Visual Studio 2012中,F#智能感应有时候在某些情况下不能工作。那么在何种情况下它会不工作呢?可以绕过去么?让我来告诉你详细情况吧。请看如下代码: 1 open System.Collections.ObjectModel 2 3 module PortableLibrary1 = 4 type Keys = 5 | One = 1 6 | Two = 2 7 | Three = 3 8 | Four = 4 9 | Five = 510 | Six = 611 | Seven = 712 |... 阅读全文
posted @ 2012-06-08 17:28 tryfsharp 阅读(203) 评论(1) 推荐(0) 编辑
摘要: 泛型数字代码是能够被用来处理多种不同数字类型包括像int 型, decimal型 和float型或者甚至是我们自己的数字类型的一些计算(比如此系列的前篇文章中的时钟运算)。泛型数字代码区别于普通的F#泛型代码像'a 链表类型 或者List.map函数, 因为数字代码使用数字操作符, 比如为每个数字类型而区别定义的+或者 >=。当编写有一些参数类型 'T的简单泛型代码的时候, 对于参数的类型我们什么也不知道并且也没有办法将其确定为某一数字类型,来提供所有我们需要在我们的代码里面使用的操作符。这就是.NET运行时的局限性,F#提供2种方式来克服这个问题。:: 静态成员约束 能 阅读全文
posted @ 2012-06-01 14:18 tryfsharp 阅读(458) 评论(0) 推荐(0) 编辑
摘要: F#提供了一个叫"活动模式"的有趣功能。它把输入的数据转换成其他不同的东西。一个有趣的使用实例就是代替枚举。但我编程枚举的时候,我总不高兴去链接枚举项到它的定义。例如,下面的枚举定义了 数字枚举,enum Numbers{ Odd, Even,}但是它没有说明什么是Odd,什么是Even。我试着使用特性或简单的注释,但是我真正想得到的是在F#中见到枚举项就获取定义。当我看见活动模式的时候,我的眼睛一下亮起来了。你真的可以使用非分部模式来解决这个问题,但是你不能放多余8项,所以我选择使用分部模式,为了我的系统在将来可以容易的扩展。let ( | Even | _ | ) x 阅读全文
posted @ 2012-06-01 14:13 tryfsharp 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 最近在西雅图F#小组期间,我被问到怎样用F#来做windows phone calculator。若是你知道F#,它并不难。计算器的骨干就是一个字符串解析器。它能被从头开始写或者用已有的东西来写。既然我想投入生产而不是准备一个面试,那么我选择使用F# powerpack提供的已有的yacc解析器。如果我把前后端的yacc分析器结合起来,大部分工作就完成了,余下的就是去补下你的yacc\lex知识。我选择使用C#XNA作为前端,因为待会我想画函数图像,担心Silverlight不能满足我的需求。你能使用F# XNA作为前端,但这不是主要的话题。整个解决方案有4个项目。两个XNA标准项目和两个F# 阅读全文
posted @ 2012-06-01 14:12 tryfsharp 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 当我尝试破解.CAB文件的时候, 我发现F#里面的COM交互不同于C#。在从"COM"选项卡增加了"Microsoft Shell Controls And Automation"之后,C#里面的实例代码像下面的代码。bool ExpandCabFile(string CabFile,string DestDir) { if (!Directory.Exists(DestDir))return false; Shell sh = new Shell(); Folder fldr =sh.NameSpace(DestDir); foreach (Folde 阅读全文
posted @ 2012-06-01 14:11 tryfsharp 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 我有一个坏习惯,对我来说,忘记它不是很容易。昨天晚上,这个小怪物又来困扰了我。可能我不能解决之前的问题,相反我被引诱到一片新领土。昨天晚上,这个怪物提醒了我单元测试 type provider, 使我想到怎样在不同的type provider方法间共享信息。目前的type provider的方法调用是独立的, 几乎没有如何维护一个内部状态的例子。正则表达式type provider是一个例子。一旦你有了匹配的组,那个组就是一个自给的结构而不需要和另外匹配的组交互。我感兴趣的是怎样使信息在type provider的方法调用中流动/共享。例如,我想Method2去更新在Method1中发送的信息 阅读全文
posted @ 2012-06-01 14:10 tryfsharp 阅读(259) 评论(1) 推荐(0) 编辑
摘要: F#3.0实现了几个新的功能:Automatically Implemented Property(AIP).这简化了在类型定义里面的属性声明,但不仅仅是这些。基本的AIP是,用更简明的语法,你就能定义一个属性。下面的MyProperty是一个AIP.typeMyType() = classmemberval MyProperty = 0 with get, setend属性MyProperty将被翻译成像下面的东西:typeMyClass() = classvalmutable internalMyProperty@ : intmemberthis.MyProperty with get() 阅读全文
posted @ 2012-05-24 11:54 tryfsharp 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 如果你曾经用一些设计器支持使用过XAML,那么你将额外地受益于设计器所带来的好处。我已经花费了数周,不用实现任何功能和设计器支持的工作。这里描述了一个案例。默认的构造函数是关键!不幸地是,F#里面的record类型没有一个默认的构造函数,这使绑定变得困难。现在我们有CTlMutable来解决这个问题。CTlMutable截屏如下:如果你定义下面的F#代码:[< CLIMutable > ]typeR = {X: int; Y:int }typeR2 = {X: int; Y:int }那么在C#代码里面你能做:varx =new R();varx2 =new R(0, 2);var 阅读全文
posted @ 2012-05-24 11:53 tryfsharp 阅读(233) 评论(0) 推荐(0) 编辑