gpt4 book ai didi

generics - 编译器覆盖 F# 中的类型定义(泛型)

转载 作者:行者123 更新时间:2023-12-01 03:56:30 27 4
gpt4 key购买 nike

场景一

let map = Dictionary<string,obj>()
map.Add("1",10)
map.Add("2",10L)
map.Add("3","10")

这很好

场景二
let map = Dictionary<string,(unit -> obj)>()
map.Add("1",fun() -> 10)
map.Add("2",fun() -> 10L)
map.Add("3",fun() -> "10")

这里编译器说它在遇到 10 时排除了 obj 但找到了 int

场景3
let map = Dictionary<string,(unit -> 'a)>()
map.Add("1",fun() -> 10)
map.Add("2",fun() -> 10L)
map.Add("3",fun() -> "10")

这里编译器接受第一个条目,但它导致 'a 被约束为 int 这导致接下来的两个条目失败,因为它们不是 int

第一个问题:为什么它在场景1中编译而在场景2中没有?

第二个问题:无论如何要防止 'a 在场景 3 中受到约束,或者是否可以使用某种模式来在 F# 的集合中启用不同类型(特别像本例中的函数类型)?

值 (obj/'a) 的唯一用途是作为 println "%A" 的参数。我不明白为什么它不能。

最佳答案

在场景 1 中,编译器自动将参数向上转换为 map.Add来自 int等到 obj ,因为可以看到map.Add预计 obj .

在场景 2 中,它不能这样做,因为没有来自 unit -> int 的向上广播可用。至 unit -> obj - 您无法通过手动插入 upcast 进行转换围绕功能。

理论上,编译器可以改为更改函数的主体,但强制转换的自动插入在调用 map.Add 时纯粹是本地的。制作。

你无法阻止 'a在场景 3 中受到限制,因为运行时要求特定对象具有特定类型 - 即使您仅以特定方式使用这些值,编译器和运行时也不会进行那种需要查看的全局分析.

关于generics - 编译器覆盖 F# 中的类型定义(泛型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16921591/

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