2013-02-15 38 views
-2

我有以下類型值,我想要做這些類型的計算基礎,但我得到了一個錯誤,說:ocaml的定義類型,並將其用於計算

這個表達型價值,但一表達預期的類型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 

回答

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是什麼意思,你必須確定對於你的添加操作符,你會注意到我只是提出了一些除Ints之外的異常。您需要填寫適合該類型的操作。

+0

我應該更新類型,看到是會幫助「+」? – user1968057 2013-02-15 17:33:21

+0

不,+具有類型:'int - > int - > int';你應該爲你的類型定義你自己的加法運算符,如'value - > value - > value'。 – nlucaroni 2013-02-15 17:35:44

+0

我寫過這樣的東西。以上在修復區域。但它返回一個值= Int 10;但我想要Nano.value = Int 10; – user1968057 2013-02-15 19:03:02

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)。我已經定義了布爾的「加法」

注意是合乎邏輯的,或者增加了兩個Nil值是Nil,並且除了對被逐點增加,但你可能會實現這些不同的行爲。

相關問題