2017-02-18 3 views
0

私は、関数を取り込んで変換するためのリストを受け取るOCamlにtransformの形式のフォームを書いています。コンパイルされず、型が一致しないと主張するので、型チェックの点でパターンマッチングで何かが間違っているとわかっていますが、私のケースで何が間違っているのか分かりません。 コンパイルしようとすると関数の名前の下に実際の宣言エラーが表示されます。OCaml関数と部分アプリケーションを理解する

let rec convert (fun: 'b -> 'c option) (l: 'b list) : 'c list = 
begin match l with 
| [] -> [] 
| h::tl -> if f h = Some h then h :: convert f tl 
     else convert f tl 

end 

私は以下のテストを書いています。これは機能が正しく動作するようにするために渡す必要があります。

let test() : bool = 
let f = func x -> if x > 3 then Some (x + 1) else None in 
convert f [-1; 3; 4] = [5] 
;; run_test "Add one" test 

エラーは私の2番目のパターンマッチのどこかにあると確信しています。

答えて

1
  1. 将来、コンパイルエラー(コンパイラの不満がある場所)について質問するときは、正確なエラーメッセージを提供する必要があります。

  2. h :: convert f tlでは、convert f tl'c listですが、このようにそれらを組み合わせることはできませんのでhは、'bです。どちらも意味がありませんf h = Some h意味:f h'c optionで、Some h'b optionです。おそらく代わりにf hを一致させたい:

    | h::tl -> match f h with 
          | Some h1 -> ... 
          | None -> ... 
    
+0

1.は何だろう、提案していただきありがとうございます。このエラーは、最初の行にある関数convertの名前に下線を引いています。 2.あなたがマッチf hと言ったら、パターンマッチをh :: tlに置き換えることを意味しますか?または、関数の2行目の 'bリストlとの一致?ありがとうございました。 – rubyquartz

+0

1.次のように、エラーメッセージも表示されます。https://ocaml.org/learn/tutorials/common_error_messages.htmlそうしないと、エラーメッセージが非常に便利なので、これを最初に修正する必要があります。私は答えを(不完全に、あなたがそれを終わらせようとすると良いから)広げた。 –

関連する問題