删除警告此表达式在Ocaml中应具有类型单位
为什么我得到警告,这个表达式应该有这个代码的unit类型?尽管它做了它应该做的删除警告此表达式在Ocaml中应具有类型单位,ocaml,Ocaml,为什么我得到警告,这个表达式应该有这个代码的unit类型?尽管它做了它应该做的 let matchInf42 list = let a = ref 0 in let lstLength = List.length list in let rec matchInf4242 list = match list with |[]->[] |m::body-> begin
let matchInf42 list =
let a = ref 0 in
let lstLength = List.length list in
let rec matchInf4242 list =
match list with
|[]->[]
|m::body->
begin
if (m < 42) then a := !a + 1;
matchInf4242 body
end
in matchInf4242 list;
if(!a = lstLength) then -1 else 0
TL;DR:您获得的错误是典型的类型错误(大部分)
“主要”是因为,不可否认,这不是一个“错误”,而仅仅是一个“警告”,但似乎这种警告()总是值得解决(即避免)
它实际上是以下模式的一个实例:
42;打印字符串“…”;;
(*或更一般地*)
任何不具有类型单位的值;任何具有“类型”单位的“值”;;
(*这将提高*)
>字符0-2:
> 42; 打印字符串“…”;;
> ^^
>警告10:此表达式的类型应为unit。
>…-:单位=()
进一步详情
回想一下,单元
是一种单例类型(仅具有值()
),通常被选择为“不返回特定值”但会产生一些副作用的函数分配返回类型
事实上,序列运算符“更一般/更灵活”,正如我们所预期的:
# let semicolon i j = i; j ;;
val semicolon : 'a -> 'b -> 'b = <fun>
单位
)
在您的问题示例的特定情况下,写下以下内容就足够了(唯一的变化是用符号§
表示):
让matchInf42列表=
设a=ref 0 in
让lstLength=List.length列表输入
让记录匹配INF4242列表=
匹配列表
|[] -> () (*←§*)
|m::body->
开始
如果(m<42),则a:=!a+1;
matchInf4242主体
结束
在matchInf4242列表中;
如果(!a=lstLength),则为-1,否则为0
List.length
函数):
让matchInf42 l=
如果List.for_all(乐趣m->m<42)l
然后-1或者0
(*或*)
让我来=
如果List.fold_向左(乐趣r e->r&e<42)则为真l
然后-1或者0
TL;DR:您获得的错误是典型的类型错误(大部分)
“主要”是因为,不可否认,这不是一个“错误”,而仅仅是一个“警告”,但似乎这种警告()总是值得解决(即避免)
它实际上是以下模式的一个实例:
42;打印字符串“…”;;
(*或更一般地*)
任何不具有类型单位的值;任何具有“类型”单位的“值”;;
(*这将提高*)
>字符0-2:
> 42; 打印字符串“…”;;
> ^^
>警告10:此表达式的类型应为unit。
>…-:单位=()
进一步详情
回想一下,单元
是一种单例类型(仅具有值()
),通常被选择为“不返回特定值”但会产生一些副作用的函数分配返回类型
事实上,序列运算符“更一般/更灵活”,正如我们所预期的:
# let semicolon i j = i; j ;;
val semicolon : 'a -> 'b -> 'b = <fun>
单位
)
在您的问题示例的特定情况下,写下以下内容就足够了(唯一的变化是用符号§
表示):
让matchInf42列表=
设a=ref 0 in
让lstLength=List.length列表输入
让记录匹配INF4242列表=
匹配列表
|[] -> () (*←§*)
|m::body->
开始
如果(m<42),则a:=!a+1;
matchInf4242主体
结束
在matchInf4242列表中;
如果(!a=lstLength),则为-1,否则为0
List.length
函数):
让matchInf42 l=
如果List.for_all(乐趣m->m<42)l
然后-1或者0
(*或*)
让我来=
如果List.fold_向左(乐趣r e->r&e<42)则为真l
然后-1或者0