1

これらの仕様に答える関数を書く必要があります。

clean_list( [],s1] = NONE

clean_list( xs, "") = NONE

clean_list ([s1, s1, s1, s1], s1) = NONE

clean_list([s1, s2, s3, s2, s1], s3) = [s1, s2, s2, s1]

ここs1s2、、、はs3文字列とxs文字列のリストです。

2 つのヘルパー関数を使用してそれを行うことができましたがis_into(xs: string list, s1: string) -> boolremove(xs: string list, s1: string) -> string listリストを 2 回再帰するのは見苦しく思えます。

clean_list(xs: string list, s1: string) =
    case (xs, s1) of
         ( [], _ ) => NONE
        |( _, "" ) => NONE
        |( _, _) => if is_into(xs, s1)
                    then remove(xs, s1)
                    else NONE

is_intoリストを 2 回 (1 回と 1回)再帰せずにそれを行う方法はありremoveますか?

注: 組み込み関数は使用されません。

すみません、仕様書の重要なケースを忘れていました

clean_list ([s1, s2, s3, s4], s10] = NONE
4

2 に答える 2

1

clean_list一部のブランチには type が'a optionあり、他のブランチには type があるため、関数は型チェックしません'b list

を返したいと仮定すると'b listNONEを に置き換える必要があります[]。パターン マッチングを再帰的に使用しclean_listて、補助関数の必要性を回避できます。

fun clean_list(xs: string list, s1: string) =
    case (xs, s1) of
      ([], _) => []
    | (_, "") => []
    | (x::xs', _) => if x = s1 
                     then clean_list(xs', s1)
                     else x::clean_list(xs', s1)
于 2013-01-23T18:48:30.977 に答える
1

リストを一度、要素ごとに簡単に調べて、指定された文字列に一致するものをすべて削除SOME lstし、最後に戻っlstて結果のリストを返すことができます

fun clean_list ([], _ ) = NONE
  | clean_list (_, "") = NONE
  | clean_list (xs, str) =
    let
      fun clean_list' [] = []
        | clean_list' (x::xs) =
          if x = str then
            clean_list' xs
          else
            x :: clean_list' xs
    in
      SOME (clean_list' xs)
    end

アップデート

上記のコードは実際にはケースを処理していないことに気付きました: clean_list ([s1, s1, s1, s1], s1) = NONE. ただし、これは簡単に修正できます。

あなたの新しい更新された仕様を考えると、最初に要素がリストにない場合は、NONE返されるべきであることがわかります。これは、すべての要素を調べたときに要素が削除されなかった場合は、 を返すということと同じNONEです。

ヘルパー関数に追加のブール引数を追加し、最初にそれを false に設定してから、各再帰呼び出しでその値を渡すことでこれを実装できることを願っています。ただし、要素が削除された場合を除きます。常に true に設定してください。

次に、これを使用して天気を決定し、結果のリストを返すSOME lstlstNONE要素が削除されていないかどうかを判断できます。

これら 2 つのことを考えると、修正する必要があるため、代わりに、ヘルパー関数がその結果を累積引数に構築することをお勧めします。このようにして、完全に制御できNONE、最後に累積リストが空になったときに簡単に戻ることができます。

于 2013-01-23T18:51:05.363 に答える