f#:导致 Intellisense 抱怨的签名文件?

Posted

技术标签:

【中文标题】f#:导致 Intellisense 抱怨的签名文件?【英文标题】:f#: Signature file causing Intellisense to complain? 【发布时间】:2013-02-15 21:43:29 【问题描述】:

给定以下代码...

type IMyInterface =
    abstract BoolA : bool
    abstract BoolB : bool
let myFn _boolVal (_i: IMyInterface) = if _boolVal then _i.BoolA else _i.BoolB
let myFnTrue = myFn true
let myFnFalse = myFn false

... Intellisense 抱怨,并且编译器失败,如果我在其中创建一个签名文件:

type IMyInterface =
    abstract BoolA : bool
    abstract BoolB : bool
val myFnTrue : (IMyInterface -> bool)
val myFnFalse : (IMyInterface -> bool)

错误是Error 10 Module 'MyModule' contains val myFnTrue : ('_a -> bool) when '_a :> MyModule.IMyInterface but its signature specifies val myFnTrue : (MyModule.IMyInterface -> bool) The types differ。 (myFnFalse 报告了类似的错误。)

我觉得自己像个白痴,无法弄清楚这一点。我究竟做错了什么? (支持“duh”的答案......)

【问题讨论】:

【参考方案1】:

在您的签名文件中,myFnTruemyFnFalse 具有签名IMyInterface -> bool,但在您的实现中'a -> bool 带有约束'a :> IMyInterface(由于automatic generalization),也就是说,实现是通用的并且签名不是。

最简单的解决方案是将您的实现更改为:

let myFnTrue i = myFn true i
let myFnFalse i = myFn false i

【讨论】:

我明白了。因此,尽管myFn 指定了一个类型化参数,但创建一个接受IMyInterface 并通过myFn true/false 返回布尔值的函数会产生一个具有通用第一个参数的函数。其他类型不会发生这种情况(例如,我尝试使用 int 而不是接口,没有问题),那么导致这种情况的接口是什么? 不可能一概而论int'a :> int 不是一个有效的约束。

以上是关于f#:导致 Intellisense 抱怨的签名文件?的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 对啥不满意?它在抱怨我的类型签名

使用 Visual Studio 2019 对 BizTalk 2020 人工制品进行单元测试会导致 Intellisense 问题

重命名项目会导致 med 代码签名错误

Visual Studio 2008 intellisense用于枚举类型

如何从 IntelliSense 隐藏公共方法

Testflight 抱怨开发者证书被用于签署应用程序