Compiler construction 类型classe,泛型记忆
有些奇怪的事情发生在y型身上,我不明白这是否合理。我倾向于认为不是 此代码工作正常:Compiler construction 类型classe,泛型记忆,compiler-construction,f#,type-inference,Compiler Construction,F#,Type Inference,有些奇怪的事情发生在y型身上,我不明白这是否合理。我倾向于认为不是 此代码工作正常: type DictionarySingleton private () = static let mutable instance = Dictionary<string*obj, obj>() static member Instance = instance let memoize (f:'a -> 'b) = fun (x:'a)
type DictionarySingleton private () =
static let mutable instance = Dictionary<string*obj, obj>()
static member Instance = instance
let memoize (f:'a -> 'b) =
fun (x:'a) ->
let key = f.ToString(), (x :> obj)
if (DictionarySingleton.Instance).ContainsKey(key)
then let r = (DictionarySingleton.Instance).[key]
r :?> 'b
else
let res = f x
(DictionarySingleton.Instance).[key] <- (res :> obj)
res
type DictionarySingleton private()=
静态let可变实例=字典()
静态成员实例=实例
让我们回忆一下(f:'a->'b)=
乐趣(x:'a)->
让key=f.ToString(),(x:>obj)
if(DictionarySingleton.Instance).ContainsKey(key)
然后让r=(DictionarySingleton.Instance)。[key]
r:?>'b
其他的
设res=fx
(DictionarySingleton.Instance)。[key]obj)
物件
这些人抱怨说
type DictionarySingleton private () =
static let mutable instance = Dictionary<string*obj, _>()
static member Instance = instance
let memoize (f:'a -> 'b) =
fun (x:'a) ->
let key = f.ToString(), (x :> obj)
if (DictionarySingleton.Instance).ContainsKey(key)
then let r = (DictionarySingleton.Instance).[key]
r :?> 'b
else
let res = f x
(DictionarySingleton.Instance).[key] <- (res :> obj)
res
type DictionarySingleton private()=
静态let可变实例=字典()
静态成员实例=实例
让我们回忆一下(f:'a->'b)=
乐趣(x:'a)->
让key=f.ToString(),(x:>obj)
if(DictionarySingleton.Instance).ContainsKey(key)
然后让r=(DictionarySingleton.Instance)。[key]
r:?>'b
其他的
设res=fx
(DictionarySingleton.Instance)。[key]obj)
物件
区别仅在于字典定义中的下划线。
推断的类型相同,但从r到类型“b”的动态转换显示错误
“此运行时强制。。。不允许对某些类型等进行运行时类型测试。'
我是缺少了什么还是有点粗糙?如果分两步编译,首先是类型
字典单例,然后是函数记忆它可以工作。
看起来编译器首先尝试找出下划线的类型(可能是泛型类型),在确定它是obj
之前,它还尝试推断r的类型。因此,在这一点上,它仍然没有与obj统一,这就是为什么一次编译失败的原因。如果分两步编译,首先是类型字典单例,然后是函数记忆,它可以工作。
看起来编译器首先尝试找出下划线的类型(可能是泛型类型),在确定它是obj
之前,它还尝试推断r的类型。因此,在这一点上,它仍然没有统一到obj
,这就是为什么如果一次编译就失败了。将此提交给优秀的fsbug人员可能是值得的。谢谢你的检查。关于类型类的优秀文章顺便说一句。。。静态和内联不是直截了当的..谢谢@nicolas!可能吧,但我不确定这是一个bug还是一个特性。我的意思是,有时候类型推断会提前推断类型,比如解决值限制,我认为这更像是一个特性。我不知道他们是否能增强对这些特殊情况的推断。是否可以对r进行展望?我会让他们知道,取决于他们是否采取行动。顺便说一句,我发送了一个与您最初编写的脚本相关的增强建议。那是我写的吗?也许是另一个古斯塔沃;)无论如何,我可以告诉你,我向FSBUG报告了一些错误,我总是从他们那里得到一些反馈,我认为这是值得的。这可能值得提交给优秀的FSBUG人员。谢谢你的检查。关于类型类的优秀文章顺便说一句。。。静态和内联不是直截了当的..谢谢@nicolas!可能吧,但我不确定这是一个bug还是一个特性。我的意思是,有时候类型推断会提前推断类型,比如解决值限制,我认为这更像是一个特性。我不知道他们是否能增强对这些特殊情况的推断。是否可以对r进行展望?我会让他们知道,取决于他们是否采取行动。顺便说一句,我发送了一个与您最初编写的脚本相关的增强建议。那是我写的吗?也许是另一个古斯塔沃;)无论如何,我可以告诉你,我向FSBUG报告了一些错误,我总是从他们那里得到一些反馈,我认为这是值得的。