如何在 OCaml 中实现没有 "else" 的 "if"?

How to implement "if" without "else" in OCaml?

我正在尝试在一个整数列表上实现 List.map,并且我有一个 if 语句来检查给定的整数是否满足指定的要求。如果满足要求,我将整数添加到新列表中。但是,因为如果 return 类型不是一个单元,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

这是不可能的,if 表达式的两个分支都应 return 一个值,因为所有 OCaml 表达式都必须计算为一个值。

List.map函数是单射变换,即对于输入列表中的每个值,输出列表中都有对应的值——一对一变换。如果你想删除一些元素,那么你正在寻找 List.filter_map 它具有类型 ('a -> 'b option) -> 'a list -> 'b list 所以过滤器函数可能 return None (函数表示缺少值)如果您不想映射该值,则它将 return Some x,例如

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