clojure - Clojure 中的高阶 if-then-else?
问题描述
如果数据满足某些条件,我经常不得不通过函数运行我的数据。通常,函数f
和标准检查器pred
都被参数化为数据。if-then-else
出于这个原因,我发现自己希望得到一个既不知道f
也不知道的高阶pred
。
例如,假设我想10
将(range 5)
. 代替
(map #(if (even? %) (+ % 10) %) (range 5))
我宁愿有一个助手——让我们称之为fork
——然后这样做:
(map (fork even? #(+ % 10)) (range 5))
我可以继续并实现fork
为功能。它看起来像这样:
(defn fork
([pred thenf elsef]
#(if (pred %) (thenf %) (elsef %)))
([pred thenf]
(fork pred thenf identity)))
这可以通过优雅地组合core
功能来完成吗?一些不错的链juxt
//也许apply
?some
或者,您知道任何实现上述(或类似)的 Clojure 库吗?
解决方案
正如 Alan Thompson 所提到的,cond->
这是一种相当标准的方式,隐含地让“else”部分成为“返回不变的值”。但是,它并没有真正解决您成为高阶的希望。我还有另一个不喜欢的理由cond->
:我认为(并争论何时cond->
发明)它通过每个匹配测试而不是第一个测试是错误的。这使得它无法cond->
用作cond
.
如果您同意我的观点,您可以尝试1 或该系列中的其他工具之一,这是我们在1flatland.useful.fn/fix
年前编写的。cond->
to-fix
正是你的fork
,除了它可以处理多个子句并接受常量和函数(例如,也许你想将 10 添加到其他偶数但将 0 替换为 20):
(map (to-fix zero? 20, even? #(+ % 10)) xs)
很容易复制cond->
using的行为fix
,但反之则不然,这就是为什么我认为这fix
是更好的设计选择。
1显然,距离fix
. 时光飞逝。
推荐阅读
- excel - MSBI Merge:如何将 Excel 文件与 SSIS 中的测试文件合并?
- python - 获取streamlit中上传文件的原名
- azure - 如何从事件网格中获取成功部署 Azure 模板的事件
- c# - 如何在检查器中创建文本/字符串容器以添加描述/信息文本以及如何适应并将其转换为 ui 文本组件?
- python - 什么是实现图像跟随光标快速移动的好方法?
- amazon-web-services - 为什么我的 aws-cli 构建在构建时可以在中间容器上工作,但不能在最终容器上工作?
- java - 为什么 startActivityForResult 没有显示在回收器视图适配器中?
- swift - SwiftUI AnyTransition.animation 在使用 .offset 时不会覆盖动画参数
- javascript - 如何从 React Element 获取我的 React 组件对象
- jquery - 选择选项不可选择 - Jquery 自动完成