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

関数のインデントは完全にオフです。いずれにせよ、foo.Substring(foo.IndexOf("."))は が必要とするstring型ではありません。listList.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.mapするのは良いアプローチですが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 がリストと単一のアイテムではなく、2 つのリストを取ることでした。

于 2012-10-25T10:20:27.277 に答える