【问题标题】:ocaml type missmatch unit vs listocaml 类型不匹配单元与列表
【发布时间】:2018-05-06 01:07:18
【问题描述】:

为了这个签名

val chooser: string list * string list -> string list

还有这个实现

 let rec chooser (inputList, trueList) = match inputList with
      [] -> []
    | iH::iT -> if (List.hd trueList)="True" 
        then iH::(chooser iT List.tl trueList)

我收到以下错误:

错误:此变体表达式应具有类型单位 构造函数::不属于单元

我做错了什么?

【问题讨论】:

    标签: ocaml typechecking


    【解决方案1】:

    没有elseif ... then 的结果必须是unit,因为当表达式为false 时,值将是()unit 类型的值)。

    换句话说,您需要为您的if 提供一个else 部件来获得您想要的类型。比较为假时的值应该是多少?

    【讨论】:

    • 您不能在功能设置中跳过案例。表达式一直都有值,只是值是什么的问题!示例表达式:let y = if x < 5 then x + 1 else x。你可以说这“跳过”了 x >= 5 的情况。但它总是有一个值。
    • 非常感谢@Jeffrey!对于错误的情况,我也不得不添加尾部递归。它工作:)
    【解决方案2】:

    else 部分未明确定义 - 因此当条件未满足时,else 部分为 ()(即单位)。 编译器将iH::(chooser iT List.tl trueList) 类型检查为unit,这是不可能的:

     if cond
        then A
        else B
    

    AB 具有相同的类型。

    【讨论】:

    • 如果是假的,如何告诉 REPL 继续?
    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 2015-05-28
    • 2012-09-23
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多