在F#中构建列表时类型不匹配

Sim*_*ard 0 f# types list

我试图从一些文件的名称建立一个列表.不幸的是我收到了一个类型错误,我不知道如何纠正.

我的代码: -

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("."))"对象有关.在这里更正类型的最佳方法是什么?

非常感谢.

pad*_*pad 5

缩进你的功能是完全没有的.无论如何,foo.Substring(foo.IndexOf("."))stringlist符合要求的类型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)

  • 感谢您花时间将list []参数从list重命名为arr; 正确的名称在使代码可读方面有很长的路要走,相反,像list |> Array.toList这样的代码(在另一个答案中)是没有充分理由的. (2认同)