f#中的神秘类型检查错误(在12345:> ISomething时丢失)

时间:2014-02-24 21:58:22

标签: f#

我有一个未正确输入的F#片段。我猜我需要将'a1和'b1约束到ISomething,但我不知道如何。底线上有两个错误。在RHS上使用f和g有下划线,错误消息显示为:类型参数缺少约束'when'?123456:> ISomething'唯一的区别是g的消息包含比f更高的神秘数字。非常感谢。

type ISomething =
    abstract getint : int

type IOther<'a, 'b> =
    abstract map : ('a->'a1) -> ('b->'b1) -> IOther<'a1, 'b1>

type sometype<'a, 'b when 'a :> ISomething and 'b :> ISomething> (a:'a, b:'b) =

    member this.map (f:'a->'a1) (g:'b->'b1) : sometype<'a1, 'b1> = sometype (f a, g b)

    interface IOther<'a, 'b> with
        member x.map (f:'a->'a1) (g:'b->'b1) = x.map f g :> IOther<'a1,'b1>

1 个答案:

答案 0 :(得分:3)

这里的问题是你的map函数专门构造了一个sometype实例。

在这种情况下,由于您直接使用本地地图功能创建IOther<'a, 'b>,因此地图功能需要 'a1'b1实现ISomething(因为你创建了一个新的sometype实例),缺少对接口实现的约束。

您可以通过将约束添加到IOther<'a, 'b>的地图功能来解决本例,即:

type IOther<'a, 'b> =
    abstract map<'a, 'b, 'a1, 'b1 when 'a1 :> ISomething and 'b1 :> ISomething> : ('a->'a1) -> ('b->'b1) -> IOther<'a1, 'b1>

这会导致sometime.map函数在您指定的约束内工作,但它会限制所有IOther<'a, 'b>个实例仅适用于ISomething

如果这还不够,另一个选择是更改sometype.map以构建一个没有约束的类型。