【问题标题】:How to implement "if" without "else" in OCaml?如何在 OCaml 中实现没有“else”的“if”?
【发布时间】:2021-07-27 04:47:42
【问题描述】:

我正在尝试在整数列表上实现 List.map,并且我有一个 if 语句检查给定的整数是否满足指定的要求。如果满足要求,我将整数添加到新列表中。但是,如果返回类型不是单位,OCaml 需要 else 语句,所以即使不满足要求,我也不得不添加一些内容。

有谁知道避免这种情况的方法或其他合适的方法吗?

谢谢!

let (--) i j = 
    let rec aux n acc =
      if n < i then acc else aux (n-1) (n :: acc)
    in aux j [] ;;

let generatePossibilities(currSum) =
    let allPossibilities = 0--100 in
    List.map (fun x -> if ((currSum + x) <= 100) then x else ("I don't want to do anything else")) allPossibilities

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    这是不可能的,if 表达式的两个分支都应该返回一个值,因为所有 OCaml 表达式都必须评估为一个值。

    List.map 函数是一个单射变换,即对于输入列表中的每个值,在输出列表中都有一个对应的值——一对一的变换。如果你想删除一些元素,那么你正在寻找List.filter_map,它的类型为('a -&gt; 'b option) -&gt; 'a list -&gt; 'b list,所以如果你不这样做,过滤函数可能会返回None(没有值的功能表示) t要映射该值,否则返回Some x,例如,

    List.filter_map (fun x -> if currSum + x <= 100 then Some x else None)
    

    【讨论】:

    • 完美。谢谢!
    • 请注意,在一种情况下,您可以在没有else 的情况下拥有if。如果表达式返回unit,则不需要else。所以像if some_condition then print_endline "blah" 这样的东西是有效的。
    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多