F#类型提供程序如何在编译时检查类型

Li *_*oyi 5 f# type-providers

所以我正在学习F#,看着这个:

F#类型提供商,他们如何工作

还有这个:

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

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

但是,他们是如何做到这一点的呢?由于数据源是外部的,似乎(对我来说)无法检查数据源的模式而不查询它,并且在编译期间(以及代码完成!)查询内容似乎是一个坏主意.

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

kvb*_*kvb 7

你问几个好问题:

  1. 类型提供程序在编译期间是否与外部数据源联系?

    是.FSharp.Data.TypeProviders命名空间中提供程序的基本思想是它们每个都包装一个代码生成器.因此,要在C#或大多数其他语言中执行相同的操作,您需要一个明确的代码生成步骤(在"编译时"之前/之前联系数据源).在F#中,这个过程更加无缝,但原则上非常相似.类型提供程序访问的数据源公开了查询模式的相对有效的方法,类型提供程序包含用于在编译期间最小化往返次数的逻辑.

  2. 如果架构发生变化,或者数据库脱机,或者......,会发生什么?

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

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

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

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