F# 值限制-已推断该值具有泛型类型
给出以下定义F# 值限制-已推断该值具有泛型类型,f#,polymorphism,value-restriction,F#,Polymorphism,Value Restriction,给出以下定义 let fn (id: int) (_:string) = id 我可以创建一个部分应用的函数 let fnPartial = fn 1 但是,将\uu的类型更改为非密封类型,如IEnumerable let fn (id: int) (_:IEnumerable) = id 导致编译错误 值限制。已推断值“FnPartical”具有 泛型 val fnportial:('''u a->int)当''u a:>IEnumerable时,要么将'fnportial'的参数显式化
let fn (id: int) (_:string) = id
我可以创建一个部分应用的函数
let fnPartial = fn 1
但是,将\uu
的类型更改为非密封类型,如IEnumerable
let fn (id: int) (_:IEnumerable) = id
导致编译错误
值限制。已推断值“FnPartical”具有
泛型
val fnportial:('''u a->int)当''u a:>IEnumerable时,要么将'fnportial'的参数显式化,要么,如果您不打算这样做的话
要使其成为泛型,请添加类型注释。(使用内置的F#
(编译程序)
但以以下回应结束
是的,这是经过设计的-IEnumerable在字符串所在的位置没有密封,并且
这将导致触发值限制
解决方法是添加类型注释
let fn (id: int) (_:IEnumerable ) = id
let fnPartial<'a> = fn 1
设fn(id:int)(u:IEnumerable)=id
让fnpartical关键是在F#中不允许值是泛型的。当部分应用函数时,结果是一个值
为了使绑定(或赋值)的左侧成为函数,必须在左侧定义一个参数
您得到的错误是由于IEnumerable
不够具体,无法完全定义值造成的。给定IEnumerable
时,您不知道要迭代什么,因此编译器无法确定值的正确类型
你的问题的答案如下:
问题的关键在于,值不能是泛型的
添加类型定义让编译器知道这不是一个值,而是一个函数,或者是允许泛型的东西李>
以下是相关的MSDN文档:
关键是不允许在F#中使用泛型值。当部分应用函数时,结果是一个值
为了使绑定(或赋值)的左侧成为函数,必须在左侧定义一个参数
您得到的错误是由于IEnumerable
不够具体,无法完全定义值造成的。给定IEnumerable
时,您不知道要迭代什么,因此编译器无法确定值的正确类型
你的问题的答案如下:
问题的关键在于,值不能是泛型的
添加类型定义让编译器知道这不是一个值,而是一个函数,或者是允许泛型的东西李>
以下是相关的MSDN文档: