ocaml - 如何在 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
解决方案
这是不可能的,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)
推荐阅读
- reactjs - 我如何为 React Material-UI 所需的 TextField 设置样式
- laravel-5 - 如何在laravel中省略特定路由的中间件
- c++ - C++ 未定义对 `utils::checkInputs 的引用
- css - Bootstrap Glyphicon 与文本框对齐
- scala - 如何在 spark-shell 中注册 kryo 类
- php - 如何使用 AJAX 表单验证 URL 字段
- asp.net - 如何发送 HTTP 请求包括破折号 - 避免无效的 URI 异常
- python - 无法在 Python Anywhere 的 Flask 应用程序中通过 Pandas 读取 CSV 文件
- outlook - 服务器端 Outlook.Exchange 规则 执行脚本
- ruby-on-rails - Rails 部署到 heroku“检测 rails 配置失败”和“/usr/bin/env: 'ruby.exe\r': 没有这样的文件或目录”