我一直在学习OCaml,并且一直在尝试编写一个函数,它接受一个int类型列表,它们代表一个矩阵。例如:[[1;2;3]; [4;5;6]; [7;8;9]]
并且作为回报我想返回一个bool值,表明它是否是一个合适的矩阵。确定的方法是矩阵中的所有行是否具有相同数量的元素(如上所示的示例)
因此,我创建了以下函数:
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
答案 0 :(得分:1)
您的原始代码错误,因为List.length a = List.length (matrix t)
通常matrix t
是布尔值,因此List.length true
的含义并不清楚。
在您的第二个解决方案中,问题出在h::t -> if (getlength h = getlength t)
。 getlength
类型为'a list list -> int
,因此您无法使用类型调用它,例如'b
(类型h
),然后使用类型{{1 ('b list
的类型)。
但总的来说,我认为你正朝着正确的方向前进。简单算法可能如下所示:
计算列表第一个元素的长度,
对于每个剩余元素计算其长度并将其与(1)的结果进行比较,如果它们相等则继续,否则返回t
。
如果没有其他元素,请返回false
。
该算法可以以多种不同的方式实现。我强烈建议你自己做,但我无法发布这个简单而优雅的解决方案:
true
再次确保在使用之前完全理解此代码。
答案 1 :(得分:0)
问题在于以下表达式:
List.length matrix t
这会尝试将List.length
应用于两个参数:matrix
和t
。此函数只接受一个参数(列表),因此报告类型错误。
答案 2 :(得分:0)
如果您希望类型系统了解您正在使用列表列表,则需要为[[]]
添加案例。
| [[]] -> true
这意味着您可以在列表上使用List.length
,就像您最初想要的那样。