我试图从一些文件的名称建立一个列表.不幸的是我收到了一个类型错误,我不知道如何纠正.
我的代码: -
open System
let buildStringList (list: string []) =
let initial = []
for i = 0 to list.Length do
let foo = list.[i]
List.append initial foo.Substring(foo.IndexOf("."))
Run Code Online (Sandbox Code Playgroud)
类型错误: -
error FS0001: This expression was expected to have type string -> 'a
but here has type string
Run Code Online (Sandbox Code Playgroud)
这与"foo.Substring(foo.IndexOf("."))"对象有关.在这里更正类型的最佳方法是什么?
非常感谢.
缩进你的功能是完全没有的.无论如何,foo.Substring(foo.IndexOf("."))是string不list符合要求的类型List.append.
你想要的是添加一个元素到累加器列表.快速修复您的功能是使用一个mutable值:
let buildStringList (arr: string []) =
let mutable result = []
for i = 0 to arr.Length do
let foo = arr.[i]
result <- foo.Substring(foo.IndexOf("."))::result
List.rev result // Use List.rev if you would like to keep the original order
Run Code Online (Sandbox Code Playgroud)
但是,推荐的方法是使用高阶函数.使用List.mapMark的答案是一种很好的方法,你可以使用Array.fold更接近代码的方法:
let buildStringList (arr: string []) =
arr
|> Array.fold (fun acc foo -> foo.Substring(foo.IndexOf("."))::acc) []
|> List.rev
Run Code Online (Sandbox Code Playgroud)
要完成,列表理解在某些情况下也很有用:
let buildStringList (arr: string []) =
[ for foo in arr -> foo.Substring(foo.IndexOf(".")) ]
Run Code Online (Sandbox Code Playgroud)