我有一个未正确输入的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>
答案 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
以构建一个没有约束的类型。