gpt4 book ai didi

f# - 强制通用参数

转载 作者:行者123 更新时间:2023-12-02 09:23:11 25 4
gpt4 key购买 nike

我有以下问题:
我有两种参数化的类型,如果两种类型具有相同的类型参数,则它们应该与通用函数一起使用

type A<'a> = A of 'a
type C<'a> = C of 'a

let inline save ((A a) :A<'a>) ((C c):C<'a>) = saveToDB (a :: c :: []) |> ignore

save (A 1) (C 2)
save (A "1") (C "2")

现在想象一个应该执行 save 的函数但具有不同的类型,将通过某些指标实例化

let inline save indicator (otherval:C<'a>) =
match indicator with
| "i" -> save (A 1) otherval
| "s" -> save (A "s") otherval

在这种情况下,我在 | "s" -> adder (A "s") otherval 上收到错误这么说otherval类型应为 C<int>

知道如何解决这个问题吗?

最佳答案

基于 Julien Roncaglia 的答案,此方法至少应该是类型安全的,因为我们正在使用 when 守卫:

let inline save ((A a) :A<'a>) ((C c):C<'a>) = saveToDB (a :: c :: []) |> ignore

let boxToGenericC<'a, 'b> (c: C<'a>) =
unbox<C<'b>>(box(c))

let save1 indicator (otherval:C<'a>) =
match indicator with
| "i" when typeof<'a> = typeof<System.Int32> -> save (A 1) (boxToGenericC<'a, int> otherval)
| "s" when typeof<'a> = typeof<string>-> save (A "s") (boxToGenericC<'a, string> otherval)

并且尝试执行 save1 "s"(C 1) 会导致模式匹配失败。

关于f# - 强制通用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40163563/

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