首页 > 解决方案 > 如何在 OCaml 中实现没有“else”的“if”?

问题描述

我正在尝试在整数列表上实现 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

解决方案


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

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

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

推荐阅读