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文档: