首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解F#值限制错误

理解F#值限制错误
EN

Stack Overflow用户
提问于 2009-07-15 13:37:41
回答 3查看 4.3K关注 0票数 22

我不明白F#中的价值限制是如何工作的。我读过维基MSDN文档中的解释。我不明白的是:

  1. 例如,为什么这会给我一个值限制错误(摘自问题): 设toleq (e:float<_>) a b= (abs (Abs))但事实并非如此: 设toleq e (a:float<_>) b= (abs (A))
  2. 这是广义的,好的..。 设is_bigger a b=a但这不是(它被指定为int): 让添加a b=a+b
  3. 为什么带有隐式参数的函数会产生值限制: 这是: 设item_count = List.fold (趣味acc _ -> 1+ acc) 0 相对于此: 设item_count l= List.fold (趣味acc _ -> 1+ acc) 0 l (请注意,如果我在代码片段中使用了这个函数,VR错误就会消失,但是函数将被指定为我使用它的类型,并且我希望它是广义的)

它怎麽工作?

(我使用的是最新的F#,v1.9.6.16)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-15 17:19:29

编辑

更好的/最近的信息在这里:保持部分应用函数的泛型

(原文如下)

我认为,在这里,一个务实的事情不是试图太深地理解这一点,而是了解一些一般的策略,通过虚拟现实,继续你的工作。这有点像个“cop out”的答案,但我不确定花时间了解F#类型系统的内部问题(这个系统在不同版本之间继续以微小的方式改变)是不合理的。

我所主张的两个主要策略是:首先,如果要用函数类型(用箭头‘->’键入)定义一个值,那么通过执行eta-转换确保它是一个语法函数。

代码语言:javascript
复制
// 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#允许的那样“后退”):

代码语言:javascript
复制
// 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

我认为这两种策略是最务实的建议。尽管如此,这是我试图回答你的具体问题。

  1. 我不知道。
  2. ‘’>是一个完全泛型的函数('a -> 'a -> bool),它适用于所有类型,因此is_bigger泛化。另一方面,'+‘是一个“内联”函数,可以工作在少数基本类型和某些类型的其他类型上;它只能在其他“内联”函数中推广,否则它必须被固定到特定类型(或默认为'int')。(ad多态性的“内联”方法是F#中的数学运算符如何克服缺乏“类型类”的问题。)
  3. 这就是我前面讨论过的‘语法函数’问题;‘让我们将其编译成字段/属性,这与函数不同,不能是泛型的。因此,如果您希望它是泛型的,那么将它变成一个函数。(有关此规则的另一个例外,请参见这个问题。)
票数 20
EN

Stack Overflow用户

发布于 2009-07-17 03:55:54

在存在副作用的情况下,引入了价值限制来解决多态性问题。F#从OCaml继承了这一点,我相信在所有ML变体中都存在价值限制。这里有一个一些 更多 链接供你阅读,除了你引用的链接。因为Haskell是纯的,所以它不受这个限制。

至于你的问题,我认为问题3确实与价值限制有关,而前两个问题则不是。

票数 5
EN

Stack Overflow用户

发布于 2009-07-15 17:23:54

没有人,包括F#团队的成员,以任何有意义的方式知道这个问题的答案。

在编译器定义真理的意义上,F#类型推理系统与VB6语法完全一样。

很不幸但却是真的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1131456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档