List OCaml编译器错误“;变量类型列表没有构造函数true“;
我一直在学习OCaml,并一直在尝试编写一个函数,该函数接受int类型的列表,这些列表表示一个矩阵。例如:List OCaml编译器错误“;变量类型列表没有构造函数true“;,list,recursion,ocaml,List,Recursion,Ocaml,我一直在学习OCaml,并一直在尝试编写一个函数,该函数接受int类型的列表,这些列表表示一个矩阵。例如:[[1;2;3];[4;5;6];[7;8;9]作为回报,我想返回一个布尔值,指示它是否是正确的矩阵。决定这一点的方法是,如果矩阵中的所有行具有相同数量的元素(如上面所示的示例) 因此,我创建了以下函数: let rec matrix lst = match lst with | h::t -> (match h with | a -> if
[[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
或一般等同于'
我得到一个编译错误,它说:变量类型列表没有构造函数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 matrix t
这将尝试将
List.length
应用于两个参数:matrix
和t
。此函数只接受一个参数(列表),因此会报告类型错误。如果希望类型系统了解您正在使用列表列表,则需要为[[]]
添加大小写
| [[]] -> true
这就意味着你可以在列表中使用
List.length
,就像你最初想要的那样。你的原始代码是错误的,因为List.length a=List.length(矩阵t)
通常矩阵t
是一个布尔值,所以不太清楚List.length true
是什么意思
在第二个解决方案中,问题出现在h::t->if(getlength h=getlength t)
中getlength
的类型为'a list->int
,因此不能用类型调用它,比如说,'b
(类型为h
),然后用类型'b list
(类型为t
)
但总的来说,我认为你们正朝着正确的方向前进。简单算法可能如下所示:
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附近)。@PierreG。你好,皮埃尔。是的,我知道,这是我目前编写的代码,它没有编译(类型错误),因此我请求帮助确定-我知道你设法编译了你的函数,但它的签名不是预期的。不!抱歉弄错了,下面已经提到了我的错误:因为(矩阵t)应该是布尔值而不是列表,所以list.length(矩阵t)没有任何意义。。。另一点:第二个匹配指令是无用的:当存在匹配时,则a=h;所以只保留下面的->并用h替换a。这很有意义!然而,现在我得到了一个编译错误,它说:变量类型列表没有构造函数true。你知道这是怎么回事吗?我想矩阵应该返回一个布尔值。。。那么List.length矩阵t或List.length(矩阵t)的含义是什么;这是List.length布尔值