[英]OCaml compiler error “variant type list has no constructor true”
我一直在学习OCaml,并且一直在尝试编写一个函数,该函数接受一个int类型的列表列表,这些列表表示一个矩阵。 例如: [[1;2;3]; [4;5;6]; [7;8;9]]
[[1;2;3]; [4;5;6]; [7;8;9]]
[[1;2;3]; [4;5;6]; [7;8;9]]
作为回报,我想返回一个布尔值,指示它是否是正确的矩阵。 决定方式是矩阵中的所有行是否具有相同数量的元素(如上面的示例所示)
因此,我创建了以下功能:
let rec matrix lst =
match lst with
| h::t ->
(match h with
| a ->
if (List.length a = List.length (matrix t)) then true else false)
我的函数类型不是我所期望的。 应该是
is_matrix : (int list) list -> bool
或带有a'的一般等价物
我收到一个编译错误,说:变量类型列表没有构造函数true知道是什么意思吗?
let rec getlength x =
match x with
| [] -> 0
| a::b -> List.length a + getlength b
let matrix lst =
match lst with
| [] -> true
| h::t -> if (getlength h = getlength t) then true else false
您的原始代码是错误的,因为List.length a = List.length (matrix t)
通常matrix t
是一个布尔值,因此不清楚List.length true
是什么意思。
在您的第二个解决方案中,问题出在h::t -> if (getlength h = getlength t)
。 getlength
的类型为'a list list -> int
getlength
'a list list -> int
,因此您不能使用类型来调用它,比如说'b
( h
类型),然后再使用'b list
( t
类型)。
但总的来说,我认为您的发展方向正确。 简单的算法可能看起来像这样:
计算列表第一个元素的长度,
对于每个剩余元素,计算其长度并将其与(1)的结果进行比较,如果它们相等,则继续,否则返回false
。
如果没有更多元素,则返回true
。
该算法可以以许多不同的方式实现。 我强烈建议您自己做,但我无法抗拒发布此简单而优雅的解决方案:
let matrix (h::t) =
let l = List.length h in
let rec f = function
| [] -> true
| h::t -> if List.length h = l then f t
else false in
f t
再一次,请确保在使用此代码之前您已完全理解该代码。
问题在于以下表达式:
List.length matrix t
这尝试将List.length
应用于两个参数: matrix
和t
。 此函数仅接受一个参数(列表),因此将报告类型错误。
如果要让类型系统了解您正在使用列表列表,则需要为[[]]
添加大小写。
| [[]] -> true
然后,这意味着您可以像最初想要的那样在列表上使用List.length
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.