OCaml编译器错误"变体类型列表没有构造函数true"

时间:2017-09-21 14:14:44

标签: list recursion ocaml

我一直在学习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  

3 个答案:

答案 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. 计算列表第一个元素的长度,

  2. 对于每个剩余元素计算其长度并将其与(1)的结果进行比较,如果它们相等则继续,否则返回t

  3. 如果没有其他元素,请返回false

  4. 该算法可以以多种不同的方式实现。我强烈建议你自己做,但我无法发布这个简单而优雅的解决方案:

    true

    再次确保在使用之前完全理解此代码。

答案 1 :(得分:0)

问题在于以下表达式:

List.length matrix t

这会尝试将List.length应用于两个参数:matrixt。此函数只接受一个参数(列表),因此报告类型错误。

答案 2 :(得分:0)

如果您希望类型系统了解您正在使用列表列表,则需要为[[]]添加案例。

| [[]] -> true

这意味着您可以在列表上使用List.length,就像您最初想要的那样。