引数が空のリストの場合、リストモジュールの一部の関数が失敗します。 List.revは例です。問題は恐ろしい値の制限です。引数が空のリストの場合、値の制限エラーを回避するにはどうすればよいですか?
let takeAllButLast (xs: 'a list) =
xs |> List.take (xs.Length - 1)
機能が空リストでうまく動作しますが、扱うでしょうバージョン:すべてが、リストの最後の要素でリストを返す関数を定義しようとしているときに、私は同じ問題を満たし
空のリストが失敗した:
let takeAllButLast (xs: 'a list) =
if List.isEmpty xs then []
else xs |> List.take (xs.Length - 1)
takeAllButLast []
error FS0030: Value restriction. The value 'it' has been inferred to have generic type
val it : '_a list, etc.
を私はいくつかのことを試してみました:それインライン関数作成する引数の型を指定していない、戻り値の型を指定し、機能させるタイプの引数に依存し、使用して中間体を得るためのオプションの型結果は後でリスト< 'a>に変換されます。何も働かなかった。
はたとえば、この機能は同じ問題を抱えている:
let takeAllButLast<'a> (xs: 'a list) =
let empty : 'a list = []
if List.isEmpty xs then empty
else xs |> List.take (xs.Length - 1)
同様の質問がSOで前に頼まれた:F# value restriction in empty listが、引数が空リストである場合にのみ答えも失敗します。
空リストと空でないリストの両方を処理する関数を書く方法はありますか?
注:質問は、リストの最後の要素以外のすべてを返す関数に固有のものではありません。
非常にクリアです。ありがとう。 – Soldalma