List 类型不匹配OCaml?

List 类型不匹配OCaml?,list,ocaml,typeerror,List,Ocaml,Typeerror,我有一个问题,OCaml认为我函数的a和s参数是单元列表s,但它们必须分别是'a列表和字符串。函数必须输出由给定分隔符分隔的列表元素 结果必须是一个字符串,输入如下:“这是标签” 另外,我知道match,但我不能用它 let rec function1 a s = if a = [] then failwith "Empty list" else if List.tl a = [] then List.hd a else if List.tl a != [] then

我有一个问题,OCaml认为我函数的
a
s
参数是
单元列表
s,但它们必须分别是
'a列表
字符串
。函数必须输出由给定分隔符分隔的列表元素

结果必须是一个字符串,输入如下:“这是标签”

另外,我知道match,但我不能用它

let rec function1 a s =
    if a = [] then failwith "Empty list" else 
    if List.tl a = [] then List.hd a else
    if List.tl a != [] then List.hd a; s; function1 List.tl a s
    ;;

function1 ["This"; "is"; "label"] "-";;

您似乎希望此表达式是字符串:

List.hd a; s; function1 List.tl a s
然而,
的含义
运算符用于计算左侧的表达式,然后忽略其值。(如果类型不是unit,则也被认为是不正确的形式。)然后计算右侧的表达式,即表达式的值

所以这个表达式表示计算
List.hd a
,然后忘记该值。然后计算
s
,然后忘记该值。然后计算递归调用

所以第一个问题是把这些东西组合成一个字符串

^
运算符连接两个字符串。所以像这样的东西更接近你想要的:

List.hd a ^ s ^ function1 (List.tl a) s

请注意,您需要将对
List.tl的调用括起来。否则,它看起来像是
函数1的两个独立参数

您似乎希望此表达式是一个字符串:

List.hd a; s; function1 List.tl a s
然而,
的含义
运算符用于计算左侧的表达式,然后忽略其值。(如果类型不是unit,则也被认为是不正确的形式。)然后计算右侧的表达式,即表达式的值

所以这个表达式表示计算
List.hd a
,然后忘记该值。然后计算
s
,然后忘记该值。然后计算递归调用

所以第一个问题是把这些东西组合成一个字符串

^
运算符连接两个字符串。所以像这样的东西更接近你想要的:

List.hd a ^ s ^ function1 (List.tl a) s

请注意,您需要将对
List.tl的调用括起来。否则,它看起来像是
函数1的两个独立参数

递归调用中
List.tl a
附近的代码中的问题缺失()。还必须使用
^
来连接字符串,而不是
。代码仍然与ocaml非常不相似

如果没有模式匹配,真的没有什么好方法可以做到这一点。如果这是一个不允许使用模式匹配的家庭作业,那么请在后面给你的老师一记重拳

参数的顺序也会更好,相反,将分隔符作为第一个参数。这样,您就可以将函数绑定到分隔符并多次重用它

两种替代实现:

let rec join s = function
| [] -> "" (* or failwith "Empty list" if you insist *)
| [x] -> x
| x::xs -> x ^ s ^ join s xs

let join s a =
  let (res, _) =
    List.fold_left
      (fun (acc, sep) x -> (x ^ sep ^ acc, s))
      ("", "")
      a
   in
   res

递归调用中
List.tl a
附近缺少代码中的问题()。还必须使用
^
来连接字符串,而不是
。代码仍然与ocaml非常不相似

如果没有模式匹配,真的没有什么好方法可以做到这一点。如果这是一个不允许使用模式匹配的家庭作业,那么请在后面给你的老师一记重拳

参数的顺序也会更好,相反,将分隔符作为第一个参数。这样,您就可以将函数绑定到分隔符并多次重用它

两种替代实现:

let rec join s = function
| [] -> "" (* or failwith "Empty list" if you insist *)
| [x] -> x
| x::xs -> x ^ s ^ join s xs

let join s a =
  let (res, _) =
    List.fold_left
      (fun (acc, sep) x -> (x ^ sep ^ acc, s))
      ("", "")
      a
   in
   res

我建议您试一试。ocaml如何从中获得
单元列表
?我希望出现错误
此表达式的类型为'a list->'a list,但表达式的类型应为'b list
。是因为
期望第一个表达式返回单位?我建议您试试。ocaml如何从中得到单位列表?我希望出现错误
此表达式的类型为'a list->'a list,但表达式的类型应为'b list
。是因为
是否希望第一个表达式返回单位?