我不明白F#中的价值限制是如何工作的。我读过维基和MSDN文档中的解释。我不明白的是:
它怎麽工作?
(我使用的是最新的F#,v1.9.6.16)
发布于 2009-07-15 17:19:29
编辑
更好的/最近的信息在这里:保持部分应用函数的泛型
(原文如下)
我认为,在这里,一个务实的事情不是试图太深地理解这一点,而是了解一些一般的策略,通过虚拟现实,继续你的工作。这有点像个“cop out”的答案,但我不确定花时间了解F#类型系统的内部问题(这个系统在不同版本之间继续以微小的方式改变)是不合理的。
我所主张的两个主要策略是:首先,如果要用函数类型(用箭头‘->’键入)定义一个值,那么通过执行eta-转换确保它是一个语法函数。
// function that looks like a value, problem
let tupleList = List.map (fun x -> x,x)
// make it a syntactic function by adding argument to both sides
let tupleList l = List.map (fun x -> x,x) l其次,如果您仍然遇到VR/泛化问题,那么指定整个类型签名来说明您想要的内容(然后按照F#允许的那样“后退”):
// below has a problem...
let toleq (e:float<_>) a b = (abs ( a - b ) ) < e
// so be fully explicit, get it working...
let toleq<[<Measure>]'u> (e:float<'u>) (a:float<'u>) (b:float<'u>) : bool =
(abs ( a - b ) ) < e
// then can experiment with removing annotations one-by-one...
let toleq<[<Measure>]'u> e (a:float<'u>) b = (abs ( a - b ) ) < e我认为这两种策略是最务实的建议。尽管如此,这是我试图回答你的具体问题。
发布于 2009-07-17 03:55:54
在存在副作用的情况下,引入了价值限制来解决多态性问题。F#从OCaml继承了这一点,我相信在所有ML变体中都存在价值限制。这里有一个一些 更多 链接供你阅读,除了你引用的链接。因为Haskell是纯的,所以它不受这个限制。
至于你的问题,我认为问题3确实与价值限制有关,而前两个问题则不是。
发布于 2009-07-15 17:23:54
没有人,包括F#团队的成员,以任何有意义的方式知道这个问题的答案。
在编译器定义真理的意义上,F#类型推理系统与VB6语法完全一样。
很不幸但却是真的。
https://stackoverflow.com/questions/1131456
复制相似问题