質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

OCaml

OCaml(オーキャムル)は、フランスのINRIAが開発した関数型言語MLの一種で、 最新の言語理論の成果が取り入れられているプログラミング言語です。

Q&A

解決済

2回答

652閲覧

内部表現を文字列表現にする

grape_ll

総合スコア83

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

OCaml

OCaml(オーキャムル)は、フランスのINRIAが開発した関数型言語MLの一種で、 最新の言語理論の成果が取り入れられているプログラミング言語です。

0グッド

0クリップ

投稿2021/06/01 05:31

###やりたいこと
ocamlにおいて,
(Mul (Mul (x,y), Add (y,Num 1)));;
のように与えられた内部表現を
xy(y+1)
のように表現したい.

###現状のコード

ocaml

1type exp = 2 | Num of int 3 | Var of string 4 | Add of exp * exp 5 | Mul of exp * exp;; 6 7let make_sum a1 a2 = Add (a1,a2);; 8 9let make_product m1 m2 = Mul (m1,m2);; 10 11let rec string_of_exp var = function 12 | Num n -> string_of_int n 13 | Var x -> x 14 | Add (x, y) -> "(" ^ string_of_exp (x) ^ "+" ^ string_of_exp (y) ^")" 15 | Mul (x, y) -> string_of_exp (x) ^ "*" ^ string_of_exp (y);;

###表示されるエラー

type exp = Num of int | Var of string | Add of exp * exp | Mul of exp * exp val make_sum : exp -> exp -> exp = <fun> val make_product : exp -> exp -> exp = <fun> File "ex3_1.ml", line 14, characters 24-41: 14 | | Add (x, y) -> "(" ^ string_of_exp (x) ^ "+" ^ string_of_exp (y) ^")" ^^^^^^^^^^^^^^^^^ Error: This expression has type exp -> string but an expression was expected of type string

###質問したい内容
stringとしてつなげたいのですが,上記の表現ではうまくそのように表現できていない様子です.
valはstringであるし,Numもstring_of_intでstringにしているのに,なぜstringとして受け取られなのでしょうか.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

問題点: function 構文の使い方、引数の位置が省略形と混同されている。

解決策A: 引数を明示する場合は match var with が必要。
解決策B: 引数を明示しない場合は、var が不要。

問題点2: 変数 x, y が未定義 ⇛ おそらく Var "x" ?


引数が意図通りに渡っているか確かめると判明すると思います。

ocaml

1type exp = 2 | Num of int 3 | Var of string 4 | Add of exp * exp 5 | Mul of exp * exp;; 6 7 8let rec string_of_exp = function 9 | Num n -> string_of_int n 10 | Var x -> x 11 | Add (x, y) -> "(" ^ string_of_exp (x) ^ "+" ^ string_of_exp (y) ^")" 12 | Mul (x, y) -> string_of_exp (x) ^ "*" ^ string_of_exp (y);; 13 14let x = Var "x" and 15 y = Var "y" in 16 print_string (string_of_exp (Mul (Mul (x,y), Add (y,Num 1)))); 17 18print_newline ();; 19

出力結果

x*y*(y+1)

明示的に書く場合

ocaml

1 2let rec string_of_exp var = 3 match var with 4 | Num n -> string_of_int n 5 | Var x -> x 6 | Add (x, y) -> "(" ^ string_of_exp (x) ^ "+" ^ string_of_exp (y) ^")" 7 | Mul (x, y) -> string_of_exp (x) ^ "*" ^ string_of_exp (y);; 8

投稿2021/06/01 07:16

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grape_ll

2021/06/02 01:59

前回書いたときから時間が空いてしまっていたので,理解が混同していました.修正したところ,問題なく動作しました,ありがとうございました.
guest

0

手元で試したところ、ご質問のエラーと同じ場所で、以下の警告も出ました。

console

1Warning 5 [ignored-partial-application]: this function application is partial, 2maybe some arguments are missing.

string_of_exp関数に与える引数が足りないので、部分適用になっているそうです。

functionを使うとき、=の左辺に現れない、一番最後の引数がマッチングの対象になります。つまり以下のようにした場合、varが第1引数になりますが、

ocaml

1let rec string_of_exp var = function

functionがマッチングに使うのはvarではなくて、その後にあるはずの第2引数になります。つまりOCamlはstring_of_expが引数を2つ取ると解釈するのです。

これをstring_of_exp xのように適用すると、引数が1つ足りないので、string値が返る代わりに、第1引数が部分適用された関数exp -> stringが返ります。そのためにエラーになっています。

string_of_expの定義の1行目を以下のように修正してください(varを削除する) これでエラーが解消するはずです。

ocaml

1let rec string_of_exp = function

投稿2021/06/01 07:14

tatsuya6502

総合スコア2046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問