繁体   English   中英

OCaml编译器错误“变量类型列表没有构造函数为真”

[英]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 ,因此您不能使用类型来调用它,比如说'bh类型),然后再使用'b listt类型)。

但总的来说,我认为您的发展方向正确。 简单的算法可能看起来像这样:

  1. 计算列表第一个元素的长度,

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

  3. 如果没有更多元素,则返回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应用于两个参数: matrixt 此函数仅接受一个参数(列表),因此将报告类型错误。

如果要让类型系统了解您正在使用列表列表,则需要为[[]]添加大小写。

| [[]] -> true

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM