【问题标题】:OCaml compiler error "variant type list has no constructor true"OCaml 编译器错误“变体类型列表没有构造函数为真”
【发布时间】: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。

标签: list recursion ocaml


【解决方案1】:

问题出在以下表达式中:

List.length matrix t

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

【讨论】:

  • 有道理!然而,现在我收到一个编译错误:变体类型列表没有构造函数 true 知道这是什么意思吗?
  • matrix 应该返回一个布尔值我猜... 那么 List.length matrix t 或 List.length (matrix t) 是什么意思?即 List.length 布尔值
【解决方案2】:

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

| [[]] -> true

这意味着您可以在列表中使用您最初想要的List.length

【讨论】:

    【解决方案3】:

    你的原始代码是错误的,因为List.length a = List.length (matrix t) 通常matrix t 是一个布尔值,所以不清楚List.length true 是什么意思。

    在您的第二个解决方案中,问题出在h::t -> if (getlength h = getlength t)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
    

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

    【讨论】:

      猜你喜欢
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      相关资源
      最近更新 更多