【发布时间】:2019-09-03 18:54:04
【问题描述】:
给出以下定义
let fn (id: int) (_:string) = id
我可以创建一个部分应用的函数
let fnPartial = fn 1
但是,将_ 的类型更改为非密封类型,如IEnumerable
let fn (id: int) (_:IEnumerable) = id
导致编译错误
值限制。值“fnPartial”已被推断为 泛型 val fnPartial : ('_a -> int) when '_a :> IEnumerable 要使其通用,请添加类型注释。 (使用内置 F# 编译器)
A bug was raised 但以以下响应关闭
是的,这是设计使然 - IEnumerable 在字符串所在的位置未密封,并且 这会导致触发值限制
解决方法是添加类型注释
let fn (id: int) (_:IEnumerable ) = id
let fnPartial<'a> = fn 1
谁能解释一下
- 问题的症结所在
- 添加类型注释如何解决问题
【问题讨论】:
标签: f# polymorphism value-restriction