F#中的警告“此构造导致代码的通用性低于类型注释所指示的含义”是什么意思

汤玛士

我有代码生成此警告。

有几则SO相关文章,最接近的是这一文章:这种结构导致代码的通用性低于类型注释所指示的通用性

但我看不到它的适用范围,因为我的代码已经在函数中

因此,所讨论的代码非常简单:

let exists (key: 'a) =
    r.Exists(string key)

let set (key: 'a) value =
    r.Set((string key), value)

let get (key: 'a) =
    r.Get(string key)

let setDefault (key: 'a) value =
    if not (exists key) then
        set key value

我试图实现的目的是允许传递不同的枚举,字符串甚至是整数作为键,并且无论传递哪种类型,都将其转换为字符串(显然是在合理的范围内)

但是当我将该代码与枚举一起使用时,标题中会出现警告。

因此,我有两个问题:

  • 我不太明白警告。有人可以向我解释吗?
  • 我如何实现传递各种枚举或字符串并从中创建字符串键?
亚伦·艾什巴赫

您可以通过一个非常简单的测试用例来重现此警告,以消除示例中的一些干扰:

let f (x: 'a) =
    string x

鉴于此,您可能会感到困惑,因为string函数的类型'T -> string,但并不是那么简单。要了解正在发生的事情,您必须查看stringFSharp.Core中该函数的实现:

    let inline anyToString nullStr x = 
        match box x with 
        | null -> nullStr
        | :? System.IFormattable as f -> f.ToString(null,System.Globalization.CultureInfo.InvariantCulture)
        | obj ->  obj.ToString()


    [<CompiledName("ToString")>]
    let inline string (value: ^T) = 
         anyToString "" value
         // since we have static optimization conditionals for ints below, we need to special-case Enums.
         // This way we'll print their symbolic value, as opposed to their integral one (Eg., "A", rather than "1")
         when ^T struct = anyToString "" value
         when ^T : float      = (# "" value : float      #).ToString("g",CultureInfo.InvariantCulture)
         when ^T : float32    = (# "" value : float32    #).ToString("g",CultureInfo.InvariantCulture)
         when ^T : int64      = (# "" value : int64      #).ToString("g",CultureInfo.InvariantCulture)
         when ^T : int32      = (# "" value : int32      #).ToString("g",CultureInfo.InvariantCulture)
         when ^T : int16      = (# "" value : int16      #).ToString("g",CultureInfo.InvariantCulture)
         when ^T : nativeint  = (# "" value : nativeint  #).ToString()
         when ^T : sbyte      = (# "" value : sbyte      #).ToString("g",CultureInfo.InvariantCulture)
         when ^T : uint64     = (# "" value : uint64     #).ToString("g",CultureInfo.InvariantCulture)
         when ^T : uint32     = (# "" value : uint32     #).ToString("g",CultureInfo.InvariantCulture)
         when ^T : int16      = (# "" value : int16      #).ToString("g",CultureInfo.InvariantCulture)
         when ^T : unativeint = (# "" value : unativeint #).ToString()
         when ^T : byte       = (# "" value : byte       #).ToString("g",CultureInfo.InvariantCulture)

这是使用静态解析的类型参数,并且为每个列出的类型使用显式实现,因此它实际上并不像从类型签名中看起来那样通用。在您的情况下,正在发生的事情是它推断出最兼容的类型,并且因为您的函数只是键入为'a,所以它是picking obj因此,由于您正在调用string并且您的输入参数被强制转换为string函数实际处理的类型之一(实际上是in anyToString),因此为obj

要使其在现实世界中的场景中工作实际上非常简单:只需使函数内联,根本不要在参数上放置类型:

let inline exists key =
    r.Exists(string key)

这将推断出参数的类型并调用的正确版本string,这几乎可以与您想要传递它的任何东西一起使用,包括枚举。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

由于以下原因导致的编译错误:警告:此构造导致代码的通用性低于类型注释所指示的通用性。

来自分类Dev

这种构造导致代码的通用性低于类型注释所指示的通用性

来自分类Dev

约束产生“此构造导致代码通用性降低……”

来自分类Dev

约束产生“此构造导致代码的通用性降低...”

来自分类Dev

%A在F#中是什么意思?

来自分类Dev

PyCharm中的此警告是什么意思?

来自分类Dev

此webrtc警告是什么意思?

来自分类Dev

此GCC警告是什么意思?

来自分类Dev

Ord在Ramda的类型注释中是什么意思?

来自分类Dev

在F#中,“期望”和“给定”之间类型不匹配的错误是什么意思?

来自分类Dev

此代码在GCC中是什么意思?

来自分类Dev

此Haskell代码中的“ id”是什么意思?

来自分类Dev

节点文档中的此“…$ {…}…”代码是什么意思?

来自分类Dev

在Kotlin中,此代码的“懒惰”是什么意思?

来自分类Dev

此Java代码中的“输入”是什么意思?

来自分类Dev

在F#中,顶层是什么意思?

来自分类Dev

此Java代码是什么意思

来自分类Dev

此sass代码是什么意思?

来自分类Dev

此VB代码是什么意思?

来自分类Dev

jQuery:此代码是什么意思?

来自分类Dev

此Java代码是什么意思

来自分类Dev

此代码是什么意思?OpenCV的

来自分类Dev

规范中此注释的含义是什么?

来自分类Dev

注释中的“ \ p”是什么意思?

来自分类Dev

此代码段中的((start:number))是什么意思,其背后的概念是什么

来自分类Dev

此警告是什么意思,我应该怎么解决?

来自分类Dev

在Typescript中,“通用类型'Feature <T>'需要1个类型参数”是什么意思?

来自分类Dev

C ++中的代码是什么意思?

来自分类Dev

“ | =“在伪代码中是什么意思?

Related 相关文章

  1. 1

    由于以下原因导致的编译错误:警告:此构造导致代码的通用性低于类型注释所指示的通用性。

  2. 2

    这种构造导致代码的通用性低于类型注释所指示的通用性

  3. 3

    约束产生“此构造导致代码通用性降低……”

  4. 4

    约束产生“此构造导致代码的通用性降低...”

  5. 5

    %A在F#中是什么意思?

  6. 6

    PyCharm中的此警告是什么意思?

  7. 7

    此webrtc警告是什么意思?

  8. 8

    此GCC警告是什么意思?

  9. 9

    Ord在Ramda的类型注释中是什么意思?

  10. 10

    在F#中,“期望”和“给定”之间类型不匹配的错误是什么意思?

  11. 11

    此代码在GCC中是什么意思?

  12. 12

    此Haskell代码中的“ id”是什么意思?

  13. 13

    节点文档中的此“…$ {…}…”代码是什么意思?

  14. 14

    在Kotlin中,此代码的“懒惰”是什么意思?

  15. 15

    此Java代码中的“输入”是什么意思?

  16. 16

    在F#中,顶层是什么意思?

  17. 17

    此Java代码是什么意思

  18. 18

    此sass代码是什么意思?

  19. 19

    此VB代码是什么意思?

  20. 20

    jQuery:此代码是什么意思?

  21. 21

    此Java代码是什么意思

  22. 22

    此代码是什么意思?OpenCV的

  23. 23

    规范中此注释的含义是什么?

  24. 24

    注释中的“ \ p”是什么意思?

  25. 25

    此代码段中的((start:number))是什么意思,其背后的概念是什么

  26. 26

    此警告是什么意思,我应该怎么解决?

  27. 27

    在Typescript中,“通用类型'Feature <T>'需要1个类型参数”是什么意思?

  28. 28

    C ++中的代码是什么意思?

  29. 29

    “ | =“在伪代码中是什么意思?

热门标签

归档