gpt4 book ai didi

f# - f# 中的嵌套泛型类型推断

转载 作者:行者123 更新时间:2023-12-01 07:59:58 26 4
gpt4 key购买 nike

在下面的代码中,我定义了两个接口(interface),第二个将第一个作为类型参数。但是,代码给出错误“类型参数‘a’未定义”。

type IFirst<'a> = 
abstract Data : 'a

type ISecond<'First when 'First :> IFirst<'a>> =
abstract First : 'First
abstract SomeData : 'a

我的问题是为什么在派生 ISecond 时 f# 不能推断出“a”是什么类型,因为信息嵌入在“First”中?例如,在下面的代码中,编译器可以推断出 'a' 是一个字符串。

type First () =
interface IFirst<string> with
member x.Data = ""

type Second () =
interface ISecond<First> with
member x.SomeData = ""
member x.First = First()

有什么办法解决这个问题还是 ISecond 必须采用两个类型参数?

编辑:我知道 ISecond 可以采用两个类型参数(请注意我最初问题的最后一行)。为了更清楚地说明我的意思,请考虑以下代码

type IFirst<'a> = interface end

type ISecond<'First, 'a when 'First :> IFirst<'a>> = interface end

type First () =
interface IFirst<string>

type Second () =
interface ISecond<First, int>

它给出了错误“这个表达式应该是字符串类型,但这里是 int 类型”,这意味着编译器知道 'a' 是一个字符串,但我仍然必须这样声明它。我想知道为什么会这样,是否有不指定第二个类型参数的解决方法。

最佳答案

您对 ISecond 的定义不正确:您提到了某种类型 'a,但没有定义它。换句话说,ISecond 实际上有两个 泛型参数 - 'First'a,但你只有定义了其中之一。

这会起作用:

type ISecond<'a, 'First when 'First :> IFirst<'a>> = 
abstract First : 'First
abstract SomeData : 'a

但是,当然,您还需要修改 Second 的定义:

type Second () =
interface ISecond<string, First> with
member x.SomeData = ""
member x.First = First()

关于f# - f# 中的嵌套泛型类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40242544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com