F#无法在注解之后推断类型自变量

时间:2018-07-20 12:34:49

标签: linq f#

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

我在做什么

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

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

  

无法基于此程序点之前的类型信息确定方法“选择”的唯一重载。可能需要类型注释。候选对象:(扩展名)Collections.Generic.IEnumerable.Select <'TSource,'TResult>(选择器:Func <'TSource,'TResult>):Collections.Generic.IEnumerable <'TResult>,(扩展名)Collections.Generic.IEnumerable .Select <'TSource,'TResult>(选择器:Func <'TSource,int,'TResult>):Collections.Generic.IEnumerable <'TResult>

我做错什么了吗?

1 个答案:

答案 0 :(得分:3)

首先,您要使用的语法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#并逐步尝试一些示例,然后再尝试实现复杂的功能。