【问题标题】:F# is unable to infer type arguments after annotationF# 无法在注释后推断类型参数
【发布时间】:2018-07-20 20:44:44
【问题描述】:

所以我有一些 json 响应内容表示为字符串,我想获取它的属性名称。

我在做什么

 let properties = Newtonsoft.Json.Linq.JObject.Parse(responseContent).Properties()
 let propertyNames, (jprop: JProperty) = properties.Select(jprop => jprop.Name);

根据this的回答,我需要注释对扩展方法的调用,但是,我仍然得到错误。

无法根据此程序点之前的类型信息确定方法“Select”的唯一重载。可能需要类型注释。候选人:(扩展)Collections.Generic.IEnumerable.Select(选择器:Func):Collections.Generic.IEnumerable,(扩展)Collections.Generic.IEnumerable .Select(selector: Func) : Collections.Generic.IEnumerable

我做错了吗?

【问题讨论】:

    标签: linq f#


    【解决方案1】:

    首先,您尝试使用的语法 x => y 是 lambda 表达式的 C# 语法,而不是 F# 语法。在 F# 中,lambda 表达式的正确语法是 fun x -> y

    其次,语法let a, b = c 的意思是“解构对”。例如:

    let pair = (42, "foo")
    let a, b = pair  // Here, a = 42 and b = "foo"
    

    您可以为其中一个对元素提供类型注释:

    let a, (b: string) = pair
    

    但这不会对pair 的工作方式产生任何影响。

    为了为 lambda 表达式的参数提供类型注释,只需注释参数,还有什么更简单的?

    fun (x: string) -> y
    

    因此,将以上所有内容放在一起,这就是您的线条应该看起来的样子:

    let propertyNames = properties.Select(fun (jprop: JProperty) -> jprop.Name)
    

    (另外,请注意末尾没有分号。F# 不需要分号)


    如果您在基本语法方面遇到这种困难,我建议您在尝试实现复杂的东西之前阅读 F# 并通过一些示例来工作。

    【讨论】:

    • 是的,我刚刚意识到。谢谢你的解释我显然是 F# 世界的新手
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多