1

リストとリストのリストを受け取り、リストの新しいリストを返す関数を作成しました。

let rec calculator list SS =
  match (List.item(0) SS) with
  |[] -> []
  |_ -> match (validate list (List.item(0) SS)) with
        |(validate theCode list) -> List.append [(List.item(0) SS)] (calculator list (SS.[1..])) 
        |_ -> (calculator list (SS.[1..]))

validate は、タプルされた 2 つの int を返す関数です。例 (1,1)

list は 4 つの int のリストです

SS は 4 つの int を持つリストのリストです

theCode は 4 つの int のリストです

「パターン識別子 'validate' が定義されていません」というエラーが表示されます。

ばかげた質問かもしれませんが、答えはわかりません。

関数を一致式の引数として使用することは許可されていませんか? それとも、ここで起こっているのはまったく別のことですか?

私の知る限りでは、2 つの検証関数は 2 つのタプルされた int を返すため、それを照合できるはずです。

4

2 に答える 2

4

質問がこれをコンパイルする方法である場合は、小さな変更のみが必要です。関数呼び出し自体はパターンではないため、値にバインドしてwhenガードを使用する必要があります。

let rec calculator list SS =
    match (List.item(0) SS) with
    | [] -> []
    | _  ->
        match (validate list (List.item(0) SS)) with
//        vvvvvvvvvv
        | x when x = (validate theCode list) ->
            List.append [(List.item(0) SS)] (calculator list (SS.[1..]))
        | _ -> (calculator list (SS.[1..]))

ただし、あなたの質問が実際に「推奨される方法は何ですか」である場合、それはこのサイト (IMO) にとっては主観的すぎますが、このロジックで理想的に読みやすいと考えるオプションとしてこれを送信します。

let rec calculator list (h::t) =
    if List.isEmpty h then h
    elif validate list h = validate theCode list then h::(calculator list t)
    else calculator list t

SS(これは、が ではなく F# リストであることを前提としていSystem.Collections.Generic.Listます。)

于 2016-11-15T10:39:44.760 に答える
4

when@ildjarnがあなたのために答えたので、これは実際にはガードを実装する方法の質問に対する答えではありません。

実際には、ライブラリ関数の方が適していると思います。あなたがしようとしているのは、検証に合格しない要素を除外するだけでなく、最初の空の要素で停止することです。のすべての要素を確実にループしたいことを保証できる場合はSS、単純に行うことができます

let calculator list = List.filter (fun s -> validate list s = validate theCode list)

空の要素で停止する必要がある場合は、次のような最初の空の要素でリストを切り取る関数を定義できます。

let upToElement element list =
    let rec loop acc = function
        | [] -> List.rev acc
        | h :: t when h = element -> List.rev acc
        | h :: t -> loop (h :: acc) t
    loop [] list

それからあなたはすることができます

let calculator list =
    upToElement [] >> List.filter (fun s -> validate list s = validate theCode list)
于 2016-11-15T12:21:12.807 に答える