F# 将F运行时作为F 4.0或3.1而不是3.0的目标有什么好处?

F# 将F运行时作为F 4.0或3.1而不是3.0的目标有什么好处?,f#,F#,在Visual Studio 2015预览版中,您可以从三个目标运行时中进行选择: 针对新版本有什么好处吗?他们是否允许您访问其他API?如果有,哪些?如果我们能列出一份全面的清单,那就太好了 不幸的是,我不认为有一个完整的清单,你可以从参考F 4.0中得到。然而,从目前的情况来看,有几个明显的问题: List、Seq和Array模块中有许多新功能,因此在可能的情况下,所有模块中都可以使用相同的功能 许多其他库添加项在表中搜索库,包括tryUnbox、isNull、ofObj、toObj、ofN

在Visual Studio 2015预览版中,您可以从三个目标运行时中进行选择:

针对新版本有什么好处吗?他们是否允许您访问其他API?如果有,哪些?如果我们能列出一份全面的清单,那就太好了


不幸的是,我不认为有一个完整的清单,你可以从参考F 4.0中得到。然而,从目前的情况来看,有几个明显的问题:

List、Seq和Array模块中有许多新功能,因此在可能的情况下,所有模块中都可以使用相同的功能

许多其他库添加项在表中搜索库,包括tryUnbox、isNull、ofObj、toObj、ofNullable、tonnullable以及waittask等非泛型任务

除了语言特性之外,对的支持无疑是一个需要新的F核的特性


此外,我不太确定预览中到底有哪些,我想大多数都没有。

查看公共表面区域的三角洲的一种快速方法是从FSharp中抄录代码。核心:-

使用下面的代码创建一个控制台应用程序,并针对您感兴趣的每个版本重新构建/重新运行它。它将转储该版本中的所有公共API。您可以使用windiff或您选择的diff工具来比较不同版本的API

open System.Reflection
let file = typeof<int list>.Assembly.Location 
let asm = Assembly.ReflectionOnlyLoadFrom(file)
let referenced = asm.GetReferencedAssemblies()

for ref in referenced do
    Assembly.ReflectionOnlyLoad(ref.FullName) |> ignore

let types = asm.GetExportedTypes()

let values = 
    types 
    |> Array.collect (fun t -> t.GetMembers())
    |> Array.map (fun v -> sprintf "%s: %s" (v.ReflectedType.ToString()) (v.ToString()))
    |> Array.sort
    |> String.concat "\r\n"

// dump to a file or print to console
printfn "%s" values

我能够为3.1和4.0版本的FSharp.Core的公共表面积生成一个新添加的完整列表。包含了我用来生成差异列表的代码,可以重新使用


谢谢你,托马斯。3.1版和3.0版怎么样?@CameronTaggart:值得注意的是,Printf模块内部的功能有了巨大的性能改进。您可以在上找到关于不同版本之间所有更改的详细信息。如果您稍微滚动一下,您会发现每个版本都有不同的帖子。@ildjarn我知道使用较新版本时在运行时会有性能改进。我的问题实际上是在设计时针对特定的版本。如果能列出Visual F Power Tools使用的元数据格式的差异,那就太棒了。我只是做了一些类似的东西,但没有那么快和脏。我创建了一个gist,其中包含使用FCS&VFPT代码记录为.fsi接口文件的公共API。代码包括在内。使用WinMerge或其他diff工具查看差异。