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