List 类型不匹配OCaml?
我有一个问题,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
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
。是因为代码>是否希望第一个表达式返回单位?