F#内联函数:实例成员约束失败

时间:2018-07-12 10:30:42

标签: generics f# constraints

我尝试将member constraintinline函数一起使用,如下所示:

    let inline extractMessageAsync 
        (envelope: ^env when ^env: 
            (member GetBodyAsync: unit-> Task<'a>)) =
    envelope.GetBodyAsync()

但是出现以下错误:

  

根据此程序点之前的信息查找不确定类型的对象。在此程序指向之前可能需要类型注释,以约束对象的类型。这样可以解决查找问题。

尽管我知道编译器需要有关此类型的更多信息,但我不明白为什么,尤其是因为它可以与static member(+)等运算符的(*)约束一起很好地工作

2 个答案:

答案 0 :(得分:2)

尝试一下:

let inline extractMessageAsync<'a, ^env
         when ^env: (member GetBodyAsync: unit-> Task<'a>)>
        (envelope: ^env) =
    (^env: (member GetBodyAsync: unit-> Task<'a>) envelope)

答案 1 :(得分:2)

您可以编写一个更简短,更通用的版本,如下所示:

   <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
    </style>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    </head>
    <body>

    <i class="fa" style="font-size:24px">&#xf07a;</i>
    <span> 5 </span>

    </body>
    </html> 

无论方法的返回类型如何,现在写let inline GetBodyAsync x = (^a: (member GetBodyAsync: unit -> ^b) x) 等效于写GetBodyAsync

用法:

fun x -> x.GetBodyAsync()