- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 F# 自定义类型提供程序(在本例中为 CheckedRegexProvider);相关来源是
[<TypeProvider>]
type public CheckedRegexProvider() as this =
inherit TypeProviderForNamespaces()
// Get the assembly and namespace used to house the provided types
let thisAssembly = Assembly.GetExecutingAssembly()
let rootNamespace = "Samples.FSharp.RegexTypeProvider"
let baseTy = typeof<obj>
let staticParams = [ProvidedStaticParameter("pattern", typeof<string>)]
let regexTy = ProvidedTypeDefinition(thisAssembly, rootNamespace, "RegexTyped", Some baseTy)
do regexTy.DefineStaticParameters(
parameters=staticParams,
instantiationFunction=(fun typeName parameterValues ->
match parameterValues with ...
open Samples.FSharp.RegexTypeProvider
type T = RegexTyped< @"(?<AreaCode>^\d{3})-(?<PhoneNumber>\d{3}-\d{4}$)">
最佳答案
类型提供程序在编译时被调用,然后编译器使用它们提供的类型来编译其余代码。
几乎每个智能处理 F# 代码的 IDE 都是通过在幕后调用 F# 编译器服务来构建 AST(通常一次一个源文件),然后对该 AST 执行操作以提供 Intellisense 等操作。
F# 编译器服务不会缓存以前编译的结果,因为您所做的任何更改都可能对源文件中的其他位置产生影响,无论是在它之前还是之后。该语句的“之后”部分是出于显而易见的原因,但为什么第 25 行的更改会影响第 10 行可能不是很明显。原因是类型推断:如果第 10 行是 let a = Array.zeroCreate 1024
,第 25 行是 a.[0] <- 42
, 那么 a
的类型将被推断为 int[]
.如果将第 25 行更改为 a.[0] <- "forty-two"
, 那么 a
的类型将被推断为 string[]
,为第 10 行构建的 AST 会有所不同。因此,每次调用 F# 编译器服务都会重新编译整个源文件。
因此,每次编辑源文件时,F# 编译器服务都会重新编译该文件。如果该文件包含您的类型提供程序定义,则编译器必须实例化类型提供程序才能编译该文件,因此您的instantiationFunction
每次编译文件时都必须调用。
所以是的,你看到的行为是设计使然。
关于F# 自定义类型提供程序 - 多次调用 DefineStaticParameters InstantiationFunction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49784944/
我有一个 F# 自定义类型提供程序(在本例中为 CheckedRegexProvider);相关来源是 [] type public CheckedRegexProvider() as this =
我是一名优秀的程序员,十分优秀!