我希望能够这样做:
let duration = 1<hours> + 2<minutes> + 3<seconds>
Run Code Online (Sandbox Code Playgroud)
具有以下类型和功能(可能还有更多计量单位):
type [<Measure>] seconds
type [<Measure>] minutes
type [<Measure>] hours
let seconds_per_minute = 60<seconds> / 1<minutes>
let minutes_per_hour = 60<minutes> / 1<hours>
let minutes_to_seconds minutes seconds = minutes * seconds_per_minute + seconds
let hours_to_minutes hours minutes = hours * minutes_per_hour + minutes
Run Code Online (Sandbox Code Playgroud)
因此,基本上应该使用"hours_to_minutes"来添加小时和分钟,并且当我在上面键入时,应该使用"minutes_to_seconds"来添加分钟和秒.
这可能在F#中做到吗?
从Visual Studio 2013 Update 2开始,可以创建可以引用Windows运行时类型的可移植类库(PCL)(之前不可能),只要它们仅针对Windows 8.1和Windows Phone 8.1而不是其他目标.
我在C#中尝试添加一个C#类库(便携式通用应用程序)并且它可以工作,这意味着您可以使用和生成Windows运行时类型,就像项目是Windows应用程序或Windows运行时组件一样.
由于F#也支持PCL,Windows 8.1和Windows Phone 8.1是支持的目标,我想用F#PCL(如果可能的话)实现相同的目标.虽然Visual Studio 2013 Update 4不提供仅针对Windows 8.1和Windows Phone 8.1的F#PCL,但可以修改F#PCL的.fsproj文件以匹配C#PCL的.csproj文件与那些目标.使用Visual Studio创建.这需要将XML元素更改为以下内容:
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile32</TargetFrameworkProfile>
Run Code Online (Sandbox Code Playgroud)
并将以下内容添加到 <ItemGroup>
<TargetPlatform Include="WindowsPhoneApp, Version=8.1" />
<TargetPlatform Include="Windows, Version=8.1" />
Run Code Online (Sandbox Code Playgroud)
在这些更改之后,我能够在F#PCL中使用和生成Windows运行时类型,就像在C#PCL中一样(没有来自F#PCL或C#(通用)Windows应用程序中的Visual Studio的抱怨),但是当我实际运行(通用)时)Windows应用程序当在C#(通用)Windows应用程序的F#PCL中调用使用Windows运行时类型的函数时,我收到以下异常:
[application name] .exe中出现'System.IO.FileNotFoundException'类型的异常,但未在用户代码中处理
附加信息:无法加载文件或程序集'Windows,Version = 255.255.255.255,Culture = neutral,PublicKeyToken = null'或其依赖项之一.该系统找不到指定的文件.
当我检查Visual Studio的解决方案资源管理器中的引用时,C#PCL显示一个名为Windows的引用,它在F#PCL中缺失.该引用的引用属性如下所示:

我尝试通过添加手动将此引用添加到F#PCL的.fsproj文件中
<Reference Include="C:\Program Files …Run Code Online (Sandbox Code Playgroud)