删除警告此表达式在Ocaml中应具有类型单位

删除警告此表达式在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

为什么我得到警告,这个表达式应该有这个代码的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
        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