当'N:equality'“错误时,修复了可怕的”A类型参数缺少约束“

时间:2014-02-02 23:08:26

标签: .net f# constraints

这段代码:

open System
open System.Collections.Generic

type INode =
    interface
        inherit IEqualityComparer<INode>
        inherit IEquatable<INode>
    end

let myFun<'N when 'N :> INode> (n:'N) = n = n

生成以下构建错误:

A type parameter is missing a constraint 'when 'N : equality'   

我知道我可以在函数级别用

来安抚编译器
let myFun<'N when 'N :> INode and 'N : equality> (n:'N) = n = n

但是我更喜欢让myFun中的类型约束和INode处的“修复”问题,以便在我想要多个函数时更容易在同样的约束下。

有可能吗?

1 个答案:

答案 0 :(得分:4)

您不需要<>内的位,这会导致问题在移除后消失:

open System
open System.Collections.Generic

type INode =
    interface
        inherit IEqualityComparer<INode>
        inherit IEquatable<INode>
    end

let myFun (n:'N when 'N :> INode) = n = n

一个更简单的版本(来自@ben)是使用速记表示可向下转换的类型如下:

let myFun (n: #INode) = n = n