-2

次の型の値があり、それらの型に基づいて計算を実行したいのですが、次のようなエラーが発生しました。

この式には型の値がありますが、型intの式が必要でした

では、計算を行うにはどうすればよいですか?

type binop = 
  | Plus 
  | Minus 
  | Mul 
  | Div 
  | Eq 
  | Ne 
  | Lt 
  | Le 
  | And 
  | Or          
  | Cons

type expr =   
  | Const of int 
  | True   
  | False      
  | NilExpr
  | Var of string    
  | Bin of expr * binop * expr 
  | If  of expr * expr * expr
  | Let of string * expr * expr 
  | App of expr * expr 
  | Fun of string * expr    
  | Letrec of string * expr * expr

type value =  
  | Int of int      
  | Bool of bool          
  | Closure of env * string option * string * expr 
  | Nil                    
  | Pair of value * value 

val x : value = Int 1
val x : value = Int 1

私がこれをするとき

 x+x;;

それからそれはそのエラーを投げます、そして私はこのようなものが欲しいです:

 Nano.value = Int 2

このようなものを修正するとvalue = Int、何かが返されますが、何かが必要ですNano.value = Int。Nano.mlというファイルが必要なので、Nano.value

let add (x,y) = match (x,y) with 
   | (Int xx, Int yy) -> Int (xx + yy)
   | ( _ , _) -> Int 0
4

2 に答える 2

1

値型の値に対して定義された「+」演算子はありません。したがって、ここで起こっていることは、整数に対して「+」演算子を呼び出しているということです。

値の型を追加するための演算子を定義する必要があります。

let ( +! ) x y = match (x,y) with 
   | (Int xx, Int yy) -> xx + yy
   |  _ -> raise <some exception>

Int 8 +! Int 2  ... should yield 10.

(注: 現在、OCaml REPL に簡単にアクセスできないため、コンパイルできない可能性があります)

また、Nil または Pair の 2 つの Closure を追加することが何を意味するのかわからない場合は、加算演算子についてそれを決定する必要があります。タイプに適したアクションを入力する必要があります。

于 2013-02-15T17:31:02.857 に答える
1

他の回答が言及しているように、型に対して独自の「プラス」演算子を定義する必要がありますvalue。このようなものが動作するはずです:

exception Bad_addition

let rec (++) a b = match (a,b) with
  | (Int(x),Int(y)) -> Int(x+y)
  | (Bool(x),Bool(y)) -> Bool(x || y)
  | (Nil,Nil) -> Nil
  | (Pair(x1,y1),Pair(x2,y2)) -> Pair(x1 ++ x2,y1 ++ y2)
  | _ -> raise Bad_addition

++これにより、値を加算するために使用できる演算子が呼び出されます。たとえば、実行Int(1) ++ Int(1)すると結果が生成されInt(2)ます。

ブール値の「加算」は論理和、2 つのNilNilの加算は 、ペアの加算は点ごとの加算であると定義しましたが、これらに対して異なる動作を実装する必要があることに注意してください。

于 2013-02-15T19:13:55.117 に答える