2

リストから指定された要素を抽出しようとしていますが、一致例外が発生しますか?

目標は、関数を次のように動作させることです。

fun extract [#"a",#"b",#"c"] [0,1,0] = [#"a",#"b",#"a"];

そして、私はこのようにそれをやろうとしています:

fun extract [] _ = []
  | extract xr (y::yr) = List.nth(xr, y) :: extract xr yr;

しかし、言ったように、私は

! Uncaught exception: 
! Match

何か案は?たぶん、これに使用できるリスト関数が他にもいくつかありますか?関数を高階関数にするはずのカレー関数について説明しましたが、それがどのように機能するのかよくわかりません。

4

1 に答える 1

1

一致エラーが発生する理由は、2番目のリストが空の場合はないが、最初のリストは空でないためです(2番目のリストのみが短くなるため、最初に最初のリストが空でない限り、常に発生します)。

基本的に、最初の行をに変更することができfun extract _ [] = []、それは機能します。

はい、高階関数を使用してこれを解決することもできます。を使用curryして、の代わりにList.nth型の関数に変換できます。次に、その関数をに部分的に適用できます。これにより、関数がタイプの関数になり、数値が指定されたときにのリストが返されます。次に、を使用して、指定されたインデックスのリスト内の各数値に関数を適用できます。したがって、関数は次のようになります。'a list -> int -> 'a'a list * int -> 'axrint -> 'aixriList.map

fun extract xr yr = List.map (curry List.nth xr) yr

しかし、あなたが思いついたものはうまくいくので、あなたはそれに固執するべきです。

于 2010-11-02T13:04:15.567 に答える