OCaml中的异常类型错误

时间:2014-10-23 18:10:50

标签: ocaml

我有一个函数,它接受True或False列表(表示二进制数),并且假设用False填充数组 但是我遇到了一个非常奇怪的类型不匹配错误。

当我这样做时

let pad x y = 
    [False;False]
;;

它返回该数组很好(认为不正确)和我什么时候

let pad x y = 
    x
;;

它返回原始数组 但是,当我尝试将两者连接在一起时,就像这样

let pad x y = 
    x::[False;False]
;;

我收到一个错误,说一个是公式类型,一个是公式列表

如果我这样做也可以。

let pad x y = 
    False::x
;;

但是当我这样做时会抛出类型不匹配错误

let pad x y = 
    x::False
;;

很抱歉,如果这是令人费解的,但我已设法收集错误的所有信息

2 个答案:

答案 0 :(得分:2)

::不是连接运算符,@是。

::获取一个元素并将其添加到列表中。因此左操作数是一个元素,只有右操作数是一个列表。执行x :: [True; False]时,两个操作数都是相同类型的列表,因此左操作数不是可以放入右操作数的元素。执行x :: False时,右操作数不是列表。 False :: x是唯一可行的,因为它是唯一一个右操作数是列表而左操作数是适合该列表的元素。

要连接两个列表,请使用@,如下所示:

x @ [False; False]

答案 1 :(得分:1)

::运算符适用于列表。在OCaml中,列表和数组是两回事。

具体来说,::运算符(左侧)一个值,(右侧)一个相同类型值的列表。它返回一个新列表,其值在列表的前面添加。这是一个非常快速的操作(恒定时间)。

您还可以使用@连接两个列表。这需要时间与左侧列表的长度成比例。所以它可能很慢。