Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List OCaml编译器错误“;变量类型列表没有构造函数true“;_List_Recursion_Ocaml - Fatal编程技术网

List OCaml编译器错误“;变量类型列表没有构造函数true“;

List OCaml编译器错误“;变量类型列表没有构造函数true“;,list,recursion,ocaml,List,Recursion,Ocaml,我一直在学习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

我一直在学习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 
或一般等同于'

我得到一个编译错误,它说:变量类型列表没有构造函数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 matrix t

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

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

| [[]] -> true

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

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

在第二个解决方案中,问题出现在
h::t->if(getlength h=getlength t)
getlength
的类型为
'a list->int
,因此不能用类型调用它,比如说,
'b
(类型为
h
),然后用类型
'b list
(类型为
t

但总的来说,我认为你们正朝着正确的方向前进。简单算法可能如下所示:

  • 计算列表第一个元素的长度

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

  • 如果没有更多元素,则返回
    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附近)。@PierreG。你好,皮埃尔。是的,我知道,这是我目前编写的代码,它没有编译(类型错误),因此我请求帮助确定-我知道你设法编译了你的函数,但它的签名不是预期的。不!抱歉弄错了,下面已经提到了我的错误:因为(矩阵t)应该是布尔值而不是列表,所以list.length(矩阵t)没有任何意义。。。另一点:第二个匹配指令是无用的:当存在匹配时,则a=h;所以只保留下面的->并用h替换a。这很有意义!然而,现在我得到了一个编译错误,它说:变量类型列表没有构造函数true。你知道这是怎么回事吗?我想矩阵应该返回一个布尔值。。。那么List.length矩阵t或List.length(矩阵t)的含义是什么;这是List.length布尔值