【发布时间】:2018-03-02 22:42:28
【问题描述】:
我一直在学习 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 (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 附近)。
-
@PierreG。你好皮埃尔。是的,我知道,这是我编写的当前代码,它没有编译(类型错误)因此我正在寻求帮助
-
好的 - 我知道你设法编译了你的函数,但它的签名不是预期的。
-
不!很抱歉混淆了,实际上是我的错误
-
正如下面已经提到的:因为 (matrix t) 应该是一个布尔值而不是一个列表,所以 List.length (matrix t) 没有意义......其他点:第二个匹配指令是useless : 当有匹配时,则 a=h;所以只保留以下 -> 并将 a 替换为 h。