【问题标题】:type error in ocaml - This expression has type (string * 'a) list, but is used with type expocaml 中的类型错误 - 此表达式具有类型 (string * 'a) 列表,但与类型 exp 一起使用
【发布时间】:2018-06-27 14:43:31
【问题描述】:

我,我在 ocaml 中有这个简单的程序

type tree = Node of string * exp * tree * tree | Empty 

and exp = Etree of tree |  EInt of int  | List of (string*exp);;

let rec evalNode.......



and rec eval (e:exp) =
(match e with
     | EInt _ -> e
     | Etree(tree) -> (match tree with 
         | Empty -> [] 
         | Node(s,i,t1,t2) -> (evalNode (tree)) )

  )

evalNode : tree -> (string * exp) list = fun

eval : exp -> exp = fun

但返回此错误但我不明白这是什么意思,网络上没有太多关于 ocaml 的信息:

这个表达式有类型 (string * 'a) 列表, 但与 exp 类型一起使用。

Etree里面有一个类型Node,类型tree也是,所以我可以用这个值调用evalNode,因为它想要一个树类型

evalNode 返回一个 (string*exp) 的列表,但它是一个 exp,所以 eval 可以返回这个

【问题讨论】:

  • 我想你可能会将List of (string*exp)(string*exp) list 混淆
  • 我相信@glennsl 搞定了,但是没有错误源的位置,没有实际代码,我们只能猜测你的问题!

标签: types ocaml


【解决方案1】:

evalNode 返回一个 (string*exp) 的列表,但它是一个 exp

这是您的错误:string * exp 的列表不是exp;编译器无法猜测您打算应用构造函数 List 来从此列表中构建 exp(如果 List 的正确定义恰好是 List of (string * exp) list)。

【讨论】:

    【解决方案2】:

    Ocaml 中的任何表达式都必须返回单一类型。因此,例如,你不能写像if a>b then "a" else 7 这样的东西,因为它不知道那个表达式的类型是字符串还是整数。

    在您的 eval 函数中,您正在做类似的事情。当eEInt 时,第一个匹配选项被触发并返回e,其类型为exp。当eEtree(Empty) 时,它会触发第二个匹配选项,该选项依次调用第二个匹配语句并触发其中的第一个匹配选项,返回[],这是一个类型为'a list 的列表(意思是列表未知类型)。当eEtree(Node(s,i,t1,t2)) 时,第二个匹配语句中的第二个匹配选项被触发,返回evalnode(tree),我们从你写的内容中知道它的类型为(string * exp) list

    因此,内部匹配本身就很好,因为它可以将通用列表与特定列表统一起来。但是结合外部匹配是有问题的,因为第一种情况返回exp,第二种情况返回(string * exp) list,所以它不知道表达式应该有什么类型。我不确定为什么错误显示为(string * 'a) list 而不是(string * exp) list,但我怀疑您无需解决问题就可以解决问题。

    我还想指出,您有一个构造函数List of (string*exp),其子类型不是列表。您可能希望这是List of (string*exp) list,然后让您的内部匹配返回List([])List(evalNode(tree)),但这只是猜测。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多