我有一个函数,它接受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
;;
很抱歉,如果这是令人费解的,但我已设法收集错误的所有信息
答案 0 :(得分:2)
::
不是连接运算符,@
是。
::
获取一个元素并将其添加到列表中。因此左操作数是一个元素,只有右操作数是一个列表。执行x :: [True; False]
时,两个操作数都是相同类型的列表,因此左操作数不是可以放入右操作数的元素。执行x :: False
时,右操作数不是列表。 False :: x
是唯一可行的,因为它是唯一一个右操作数是列表而左操作数是适合该列表的元素。
要连接两个列表,请使用@
,如下所示:
x @ [False; False]
答案 1 :(得分:1)
::
运算符适用于列表。在OCaml中,列表和数组是两回事。
具体来说,::
运算符(左侧)一个值,(右侧)一个相同类型值的列表。它返回一个新列表,其值在列表的前面添加。这是一个非常快速的操作(恒定时间)。
您还可以使用@
连接两个列表。这需要时间与左侧列表的长度成比例。所以它可能很慢。