2017-04-12 8 views
-3

私は、次のループがあります。OCamlの表現型unmatchings

let show expr = 
    let rec loop acc = function 
    | `S -> "S"^acc 
    | `K -> "I"^acc 
    | `I -> "I"^acc 
    | `App(a,b) -> (loop acc a)^(loop acc b) 
    | `B -> "B"^acc 
    | `C -> "C"^acc 
    | `Sprim -> "S'"^acc 
    | `Bprim -> "B'"^acc 
    | `Bstar -> "B*"^acc 
    | `Cprim -> "C'"^acc 
    | `Var(a) -> a^acc 
    | `Con(a) -> a^acc 
    in 
    loop "" expr 

をそして私は「私はこの方法で使用しなければならない」次のprintln機能を持っています。以下を印刷するためには

let println x = 
     printf "%s\n" (show x) 

println (`App(`App(`App(`Bstar, `K), `K), `K));; 

私はそれを実行すると、私は"printf "%s\n" (show x)"ラインに次のエラーを取得:

Error: This expression has type 
     ('a -> 'b -> 'c, out_channel, unit, unit, unit, 'a -> 'b -> 'c) 
     CamlinternalFormatBasics.fmt 
     but an expression was expected of type 
     ('a -> 'b -> 'c, out_channel, unit, unit, unit, unit) 
     CamlinternalFormatBasics.fmt 
     Type 'a -> 'b -> 'c is not compatible with type unit 

どこに間違いはありますか?どうすれば修正できますか?

私は次の値印刷する:printlnshowを渡さないでください

"B* K K K” 
+2

エラーが発生する理由が不十分です。あなたの問題を自己完結型だが、pplが読むことができるように十分に小さくしてみてください。 – camlspotter

+0

他に何を書いていますか?私はコード全体を書いた。 – yusuf

+0

よろしくお願いします。あなたがするより良いことがないように思われるので、ただあなたは何かを理解していない、あなたはそれをdownvote。これがあなたのキャラクターです。 – yusuf

答えて

2

を:

println (`App(`App(`App(`Bstar, `K), `K), `K)) 

また、"I"^accは、おそらくKの場合のために"K"^accでなければなりません。

;;を使用して、トップレベルで用語を区切っていることを確認してください。あなたは

let println x = 
    Printf.printf "%s\n" (show x) 

println (`App(`App(`App(`Bstar, `K), `K), `K)) 
println

(`App ...)を持っている場合はprintfへの引数とみなされます。

let println x = 
    Printf.printf "%s\n" (show x) 
;; 

println (`App(`App(`App(`Bstar, `K), `K), `K)) 
+0

私はまだエラーが発生します。私はその質問を編集しており、そこに誤りを置くでしょう。 – yusuf