我想用一个更短的方法来写这段代码,因为这将在我正在工作的项目中的多个地方使用。有没有一个库可以让我使用,它将有一个功能来满足我的特定需要?
case mbData1, mbData2 of
(Just data1, Just data2) -> Just $ mergeData data1 data2
(Nothing, Just data2) -> Just data2
(Just data1, Nothing) -> Just data1
(Nothing, Nothing) -> Nothing
2条答案
按热度按时间qnakjoqk1#
首先 , 请 注意 , 仅 当
mergeData x y
与x
和y
具有 相同 的 类型 时 , 表达式 才 有 意义 , 即 , 如果 其 类型 为中 的 每 一 个
对于 某些 混凝 土 类型
X
。鉴于 此 , 我们 可以 依赖 于 Maybe 的 应用 型 和 替代 型 示例 :
格式
如果 您 希望 多次 重用 此 模式 , 但 针对 不同 的 函数 , 并且 您 认为 这 一 点 不 明确 , 则 可以 定义 一 个 在
mergeData
上 参数 化 的 函数 。但是 等等 , 也许 我们 可以 做 一些 更 简单 的 事情 ! 如果 你 的
mergeData
函数 是 结合 的 ( 即mergeData x (mergeData y z) = mergeData (mergeData x y) z
) , 那么 你 的 X 类型 是 一 个 半群 , 它 的 组合 运算 是mergeData
。 在 这种 情况 下 , 考虑 定义 半群 示例 。 然后 你 可以 使用 为 半群 设计 的 工具 来 更 简单 地 处理 这个 问题 。格式
令 人 惊奇 的 是 : 如果 你 给 X 一 个 半群 示例 , 你 甚至 根本 不 需要 实现
mergeTwoMaybeDatas
- - 这 只是(<>)
对 提升 到 Maybe 的 半群 的 行为 。我 鼓励 您 为 您 的 类型 提供 它们 可以 合理 支持 的 所有 类型 类 的 示例 :你 会 发现 很多 像 这样 的 通用 工具 , 然后 " 免费 " 地 在 它们 上面 工作 。 拥有 一 个 半群 示例 可能 也 会 帮助 你 对 这种 X 类型 的 一些 其他 使用 。
3qpi33ja2#
您正在从the
semialign
package中查找salign
函数。为您的类型创建一个Semigroup
示例,使用(<>) = mergeData
(或者内联其定义,并始终以这种方式调用它),然后调用salign mbData1 mbData2
。