Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 类型classe,泛型记忆_Compiler Construction_F#_Type Inference - Fatal编程技术网

Compiler construction 类型classe,泛型记忆

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)

有些奇怪的事情发生在y型身上,我不明白这是否合理。我倾向于认为不是

此代码工作正常:

   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报告了一些错误,我总是从他们那里得到一些反馈,我认为这是值得的。