gpt4 book ai didi

f# - 泛型函数的类型推断解决方法

转载 作者:行者123 更新时间:2023-12-01 13:41:39 24 4
gpt4 key购买 nike

给定以下参数类型

type SomeDU2<'a,'b> = 
| One of 'a
| Two of 'a * 'b

我必须检查给定的参数是否是相应的联合案例而不考虑参数

let checkOne x = 
match x with
| One _ -> true
| _ -> false

let checkTwo x =
match x with
| Two _ -> true
| _ -> false

这工作得很好并且符合预期

let oi = checkOne (One 1)
let os = checkOne (One "1")
let tis = checkTwo (Two (1, "1"))
let tsi = checkTwo (Two ("1", 1))

我可以随意切换类型。
现在,不过我喜欢将这两个函数合并为一个创建函数

let makeUC () = (checkOne, checkTwo)

然后像这样实例化

let (o,t) = makeUC ()

现在只有它给我这个错误信息

Value restriction. The value 'o' has been inferred to have generic type
val o : (SomeDU2<'_a,'_b> -> bool)
Either make the arguments to 'o' explicit or, if you do not intend for it to be generic, add a type annotation.
val o : (SomeDU2<obj,obj> -> bool)

其实我不想要那个——我也不需要那个。可能是 F# 中缺少更高种类类型的一个实例有解决办法吗?

编辑

实际上,根据下面@johns 的评论,我的问题并不完整。显然我可以做到以下几点

let ro1 = o ((One 1) : SomeDU2<int,int>)
let rt1 = t (Two (1,2))

然后将向后推断ot类型为 SomeDU2<int,int> -> bool (我觉得这个倒推很奇怪)。那么问题是o不再允许以下内容。

let ro2 = o ((One "1") : SomeDU2<string,int>)

所以我必须实例化一个特定的 o SomeDU2 的通用参数的每个组合的实例.

最佳答案

即使没有元组,您也会遇到值限制:

let o = (fun () -> checkOne)()

如果您需要调用函数的结果适用于任何类型的值,那么一种解决方案是使用泛型方法创建标称类型的实例:

type DU2Checker =
abstract Check : SomeDU2<'a,'b> -> bool

let checkOne = {
new DU2Checker with
member this.Check(x) =
match x with
| One _ -> true
| _ -> false }

let checkTwo = {
new DU2Checker with
member this.Check(x) =
match x with
| Two _ -> true
| _ -> false }

let makeUC() = checkOne, checkTwo

let o,t = makeUC()

let false = o.Check(Two(3,4))

关于f# - 泛型函数的类型推断解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39700503/

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