在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
运算符,而不是字符串运算符?
答案 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 ","