【问题标题】:How do F# Type Providers check types at compile timeF# 类型提供程序如何在编译时检查类型
【发布时间】:2011-10-25 23:41:09
【问题描述】:

所以我正在学习 F#,并查看了这个:

F# type providers, how do they work

还有这个:

http://msdn.microsoft.com/en-us/library/hh361033(v=vs.110).aspx

我对 F# 不是很流利,但我(可能不完整)的理解是类型提供程序旨在为您提供对外部数据源的某种静态类型安全访问。

但是,他们是如何做到这一点的?由于数据源是外部的,因此(在我看来)除了查询之外没有办法检查数据源的架构,并且在编译期间查询内容(以及代码完成!)似乎是个坏主意。

但是,如果他们不这样做,则必须进行一些转换以将未知数据源转换为某些模式(然后可以对其进行类型检查),如果数据源可以,则可能会失败'不被铸造。

【问题讨论】:

    标签: f# type-providers


    【解决方案1】:

    你问了几个好问题:

    1. 类型提供者在编译过程中是否联系外部数据源?

      是的。 FSharp.Data.TypeProviders 命名空间中的提供者的基本思想是它们各自包装一个代码生成器。因此,要在 C# 或大多数其他语言中做同样的事情,您将有一个明确的代码生成步骤(在“编译时”/之前联系数据源)。在 F# 中,该过程更加无缝,但在原理上非常相似。类型提供者访问的数据源公开了查询模式的相对高效的方法,并且类型提供者包含了在编译期间最小化往返次数的逻辑。

    2. 如果架构改变,或者数据库离线,或者......会发生什么?

      一般来说,这取决于类型提供者,但内置类型提供者向用户公开了一些选项。特别是,可以指示提供者应该缓存模式的本地副本以防数据库变得无法访问(或者,也可以强制提供者反对实时数据,以便在编译期间立即报告错误,如果发生任何不匹配)。

      同样,这与其他语言中的代码生成方法并没有太大区别 - 如果架构从您下面更改,您可能会快速失败(如果您重新生成代码并且您对生成的代码的引用不再行如预期的那样),或者您可以尝试蒙混过关(例如,永远不要重新生成代码并希望事情在运行时排队)。

    这些答案适用于内置提供程序,但作为提供程序编写者,有些人当然可以选择做一些不同的事情(尽管我认为我概述的方法对大多数外部数据源都有意义)。

    【讨论】:

    • 我相信你,但仍然很难相信。这意味着 Visual Studio 实际上会在编译(和代码完成)过程中发送 http 请求和数据库查询以及所有这些东西来获取架构?我已经编程了一段时间,但我认为我在其他任何地方都没有看到过这种事情;通常在与外部数据存储的接口处总是存在隐式转换。有没有什么地方我可以在一般情况下查找这个概念,而不是特定于 F#?
    • 观看大约 3 分钟:channel9.msdn.com/events/BUILD/BUILD2011/SAC-904T,从 25:30 开始。是的,当你按下'。在 IDE 中,Visual Studio 正在发送 Web 请求以获取另一部分架构以呈现 Intellisense 自动完成。它可能很新颖,而且非常棒:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 2012-08-20
    相关资源
    最近更新 更多