1

数値と数値のリストを取り、リストにそのような数値がない場合は NONE を返し、そうでない場合はこの数値なしでリストオプション (Haskell では「多分」) を返す関数を宣言するにはどうすればよいですか? そのような番号が複数ある場合、関数は最初の番号だけを消去する必要があります。

all_except_one : 'a * 'a list -> 'a list option

私はそれを行う方法がわかりません:\関数型スタイルのアルゴリズムに関するヒントだけを、任意の言語の任意のコードに尋ねます(最初は、この問題をSMLで解決する必要があります)。また、タスクで高階関数を使用することはできません。

4

2 に答える 2

6

このソリューションはどうですか?

fun all_except_one(s, lst) =
    let
        fun helper e =
            case e of
                ([], _) => NONE
               |(x::xs, acc) => if x = s
                                then SOME (acc @ xs)
                                else helper(xs, x :: acc)
    in helper(lst, []) end

ヘルパー関数がなくても末尾再帰がなくても同じです。

fun all_except_one (_, []) = NONE
  | all_except_one (s, x::xs) = if x = s
                                then SOME xs
                                else case all_except_one(s, xs) of
                                           NONE => NONE
                                         | SOME ys => SOME (x::ys)
于 2013-01-26T18:18:00.047 に答える
1

どうですか(Haskell構文):

allbutone n xs
    | n `elem` xs = Just (filter (!=n) xs)
    | otherwise   = Nothing
于 2013-01-26T18:09:53.827 に答える