“List <int>”类型与“string”类型不匹配

时间:2015-10-20 15:16:54

标签: f#

在F#中 "Hello"+"World"代表“HelloWorld”。我的意思是+运算符可以连接字符串。

Given this code:
let iprint list:List<int> =
 let stringList=int2String4List list         //convert the int list to string list
 List.foldBack (fun acc elem -> acc+elem+','  ) stringList  ""

但我遇到了错误:

The type 'List<int>' does not match the type 'string'

在我看来,F#将stringList的数据类型解释为int,同时它是List<string>。但我不知道它是怎么发生的?

List.foldBack : ('T -> 'State -> 'State) -> 'T list -> 'State -> 'State

这意味着,函数的第一个参数和列表的数据类型必须相同,但是为什么它坚持接受+作为int运算符,而不是字符串运算符?

1 个答案:

答案 0 :(得分:1)

您在函数声明中遗漏了括号,因此类型注释(List<int>)已应用于函数返回值。这将编译:

let iprint (list:List<int>) =
    let stringList=int2String4List list
    List.foldBack (fun acc elem -> acc+elem+",") stringList  ""

顺便说一下,int2String4List只是List.map string

此外,fun acc elem -> ...的参数顺序错误。如果检查List.foldBack所期望的函数类型,您将看到它是'T -> 'State -> 'State - 第一个参数是列表的元素,第二个参数是累加器。您发布的示例('T'State均为string)没有太大差异,但如果您想缩短它,则会有所不同:

let iprint list =
    List.foldBack (fun elem acc -> (string elem) + "," + acc  ) list  ""

@JoelMueller在评论中注意到,实现这一结果的最短,最快的方式是

let iprint =
    List.map string >> String.concat ","