0

我正在尝试从一些文件的名称中构建一个列表。不幸的是,我收到了一个我不知道如何纠正的类型错误。

我的代码:-

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("."))

类型错误:-

  error FS0001: This expression was expected to have type string -> 'a
  but here has type string

这与“foo.Substring(foo.IndexOf("."))”对象有关。在这里获得正确类型的最佳方法是什么?

非常感谢。

4

2 回答 2

5

您的功能的缩进完全关闭。无论如何,is foo.Substring(foo.IndexOf("."))astring不是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

但是,推荐的方法是使用高阶函数。虽然使用List.mapas Mark's answer 是一种好方法,但您可以使用Array.fold更接近您的代码的方法:

let buildStringList (arr: string []) =
    arr
    |> Array.fold (fun acc foo -> foo.Substring(foo.IndexOf("."))::acc) []
    |> List.rev

完整地说,列表理解在某些情况下也很有帮助:

let buildStringList (arr: string []) =
    [ for foo in arr -> foo.Substring(foo.IndexOf(".")) ]
于 2012-10-25T10:24:47.803 回答
2

我认为这是一种更实用的方式来做你正在尝试的事情:

open System

let buildStringList (list: string []) =
      list |> Array.toList |> List.map (fun x -> x.Substring(x.IndexOf(".")))

您的特定错误的原因是 List.append 需要两个列表,而不是一个列表和一个项目。

于 2012-10-25T10:20:27.277 回答