2017-07-26 8 views
0

OcamlとMLには一般的に非常に新しく、非常に根本的な問題を抱えています。私はパターンマッチを使用しており、1つのマッチ内で2つ以上の連結ステートメントを出力したいと考えています。例えば。 chan^"("^var^")"^op2^(poc p); chan^"("^var^")"^op^(poc p)Ocamlは1つ後のステートメントを印刷します

let processoperatorchange2 t2s2 proc2 op op2= 
    let rec poc2 p = match p with 
    | Zero -> "0" 
    | Pproc (x) -> String.lowercase x 
    | In(chan, var, _, p, _) -> chan^"("^var^")"^op^(poc2 p); chan^"("^var^")"^op2^(poc2 p) 
    in poc2 proc2 

しかし、その後、私はこれを実行するたびに、印刷された唯一の文はセミコロンの後に最後のものです。私はこれにいくつかの助けを得ることができますか?

+0

完全一致式を追加できますか?あなたの質問から、私はあなたがそれを印刷する代わりに文字列を返すと推測することができます。 – nefas

+0

こんにちは、はい、コードで質問を編集しました。問題は、連結された文字列が異なるユーザー定義型の組み合わせであることです。今は単純に出力しますが、変数に代入するときは単位を返し、印刷できません。 – user1514567

答えて

1

この関数は文を出力しませんが、文字列を作成するため、値を返します。副作用はありません。セミコロン演算子は、2つの式の間に散在する場合、これらの式から生成された値を結合しません。したがって、"hello"; "world"の場合、結果は"world"です。あなたがそうしたときのあなたの状況はどうなるのですか?

chan^"("^var^")"^op^(poc2 p); chan^"("^var^")"^op2^(poc2 p) 

リフトのすべてがちょうど投げ捨てられます。

クイックフィックスは、例えば、

chan^"("^var^")"^op^(poc2 p)^";\n"^chan^"("^var^")"^op2^(poc2 p) 

をそれらを連結することであろう。しかし、一般的に、ASTを印刷する慣用的な方法は、Formatモジュールを使用し、再帰pp機能を実装し、それがFormat.formatter -> 'a -> unitを入力していることです。戻り値の型に注意してください。関数は文字列を作成しません(通常は2次複雑度の演算です)。しかし、それを汎用出力ストリームに出力します。

+0

こんにちは、 。 Format.Formatterオプションを試してみます。ありがとう! – user1514567

+0

こんにちは、私はフォローアップの質問があります。セットに追加するために私の質問でこの文字列を作成したいと仮定した場合、最良の方法は何ですか?現時点では、私はそれを印刷していますが、文字列変数に実際に割り当てたいのですが?そのようにするたびに、単位を返します – user1514567

+0

Format.asprintf関数を使用して文字列に出力することができます。 – ivg

関連する問題