F#中带有类型注释的值限制,而没有显式函数参数

亚基米奇

我一直在尝试消除以下F#函数中的显式参数:

let mapToSelf (s: seq<'a>): seq<'a> = s |> Seq.map id

这个带有显式参数的版本具有预期的s推断类型seq<'a> -> seq<'a>,我可以将其用于映射不同类型的序列:

let stringSeq = mapToSelf [ "asd"; "qwe" ]
let intSeq = mapToSelf [ 1; 2; 3 ]

到现在为止还挺好。现在,我想删除显式函数参数s,如下所示,我(错误地?)期望它与第一个版本等效:

let mapToSelf: (seq<'a> -> seq<'a>) = Seq.map id

现在,我在这条线上收到警告:

let stringSeq = mapToSelf [ "asd"; "qwe" ]
// The construct causes code to be less generic than indicated by the type annotations

由于下一个函数现在具有签名,因此在下一行会出现错误(seq<string> -> seq<string>)

let intSeq = mapToSelf [ 1; 2; 3 ]
// The expression was expected to have type 'string', but here was type 'int'

我的问题是:为什么我指定的通用类型签名seq<'a> -> seq<'a>会被通用性较弱的类型覆盖seq<string> -> seq<string>有没有一种方法可以在不显式指定参数的情况下声明此类函数?

泰勒·伍德

您只需要用泛型类型装饰绑定:

> let mapToSelf<'T> : seq<'T> -> seq<'T> = Seq.map id;;
val mapToSelf<'T> : (seq<'T> -> seq<'T>)

> mapToSelf [| 1; 2 |];;
val it : seq<int> = seq [1; 2]
> mapToSelf [ "1"; "2" ];;
val it : seq<string> = seq ["1"; "2"]

为什么我指定的通用类型签名seq<'a> -> seq<'a>被一个不太通用的类型覆盖seq<string> -> seq<string>

由于没有用于类型泛化的函数参数,编译器会从首次使用时推断其类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将内联显式类型注释添加到具有返回值但在Swift中没有输入参数的闭包中?

F#中没有装箱的多参数事件类型

带有多个参数的显式构造函数

在显式定义构造函数时,没有在类中定义0参数的构造函数

plpgsql:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换

PostgreSQL错误没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换

为什么F#有两种类型的显式类型声明?

声明带有隐式参数的函数类型

带有可变参数模板参数的成员函数的显式专业化

在 TypeScript 中,当类型是函数的参数时,有没有办法限制 Partial<T> 类型的额外/多余属性?

带有显式 JSDoc 注释的奇怪打字稿推理

如何在 Scala 中定义带有类型参数的隐式函数?

如何对没有显式返回类型的递归函数进行类型检查?

有没有一种方法可以为F#构造函数中的函数指定命名参数?

F#函数参数类型注释不起作用

提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。Trigram相似性Django

没有参数但在Julia中具有类型的函数

反向Pinvoke:传递数组长度而没有用于大小的显式函数参数

没有显式返回的关联函数为错误[E0308]:类型不匹配

Oracle-通过SELECTable函数返回结果集,而没有显式的对象/表类型

有没有办法在 C++ 中显式调用可选参数?

在TypeScript中显式键入通用函数参数与隐式键入之间有什么区别?

具有默认值但没有类型注释的函数参数的推断类型是什么?初始化为“无”的变量如何?

没有带有常量“模板参数”的F#泛型?

angularjs错误:[$ injector:strictdi]函数($ httpProvider)没有使用显式注释,因此无法在严格模式下调用

VkSurfaceKHR指针的值在函数调用后发生更改,而没有任何显式分配

具有可变类型的F#函数

python中带有继承的类型注释

在F#中,带有强制构造函数参数的对象初始化程序语法是什么?