2015-09-13 102 views
2
type form = TRUE 
    |FALSE 
    |NOT of form 

let rec check x = function 
    TRUE   -> true 
    |FALSE   -> false 
    |NOT(y)   -> not eval y 
(*where TRUE, FALSE and NOT all custom type 'form'*) 

我试图定义一个函数形式 - > BOOL,但我得到的编译错误为返回一个函数返回布尔VS返回布尔(OCaml的)

|NOT(y)   -> not eval y 

线。该错误消息指出

This expression type form -> bool, but an expression was expected of type bool 

虽然功能“的eval”返回“BOOL”类型,什么是它不能用于返回布尔函数返回值的原因是什么?

+1

不要忘记,功能结合到左侧,所以最好写'不(EVAL Y)':

let rec eval = function | TRUE -> true | FALSE -> false | NOT(y) -> not (eval y) 

与明确的输入参数x另一种形式 –

回答

1

您定义的函数的类型(checkeval)是'a -> form -> bool。您匹配function关键字引入的隐式输入参数。第一个参数x未使用(但预期)。

由于eval有两个输入参数,(eval y)表达式的类型为form -> bool。这是错误信息。

试试这个:

let rec eval x = match x with 
    | TRUE -> true 
    | FALSE -> false 
    | NOT(y) -> not (eval y) 
+0

谢谢,我明白了! –