haskell 如果存在,则合并两个Just值,否则返回第一个Just值

q9rjltbz  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(151)

我想用一个更短的方法来写这段代码,因为这将在我正在工作的项目中的多个地方使用。有没有一个库可以让我使用,它将有一个功能来满足我的特定需要?

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
qnakjoqk

qnakjoqk1#

首先 , 请 注意 , 仅 当 mergeData x yxy 具有 相同 的 类型 时 , 表达式 才 有 意义 , 即 , 如果 其 类型 为

mergeData :: X -> X -> X

中 的 每 一 个
对于 某些 混凝 土 类型 X
鉴于 此 , 我们 可以 依赖 于 Maybe 的 应用 型 和 替代 型 示例 :

mergeTwoMaybeDatas :: Maybe X -> Maybe X -> Maybe X
mergeTwoMaybeDatas a b = liftA2 mergeData a b <|> a <|> b

格式
如果 您 希望 多次 重用 此 模式 , 但 针对 不同 的 函数 , 并且 您 认为 这 一 点 不 明确 , 则 可以 定义 一 个 在 mergeData 上 参数 化 的 函数 。
但是 等等 , 也许 我们 可以 做 一些 更 简单 的 事情 ! 如果 你 的 mergeData 函数 是 结合 的 ( 即 mergeData x (mergeData y z) = mergeData (mergeData x y) z ) , 那么 你 的 X 类型 是 一 个 半群 , 它 的 组合 运算 是 mergeData 。 在 这种 情况 下 , 考虑 定义 半群 示例 。 然后 你 可以 使用 为 半群 设计 的 工具 来 更 简单 地 处理 这个 问题 。

data X = ...
instance Semigroup X where
  (<>) = mergeData

mergeTwoMaybeDatas :: Maybe X -> Maybe X -> Maybe X
mergeTwoMaybeDatas = (<>)

格式
令 人 惊奇 的 是 : 如果 你 给 X 一 个 半群 示例 , 你 甚至 根本 不 需要 实现 mergeTwoMaybeDatas - - 这 只是 (<>) 对 提升 到 Maybe 的 半群 的 行为 。
我 鼓励 您 为 您 的 类型 提供 它们 可以 合理 支持 的 所有 类型 类 的 示例 :你 会 发现 很多 像 这样 的 通用 工具 , 然后 " 免费 " 地 在 它们 上面 工作 。 拥有 一 个 半群 示例 可能 也 会 帮助 你 对 这种 X 类型 的 一些 其他 使用 。

3qpi33ja

3qpi33ja2#

您正在从the semialign package中查找salign函数。为您的类型创建一个Semigroup示例,使用(<>) = mergeData(或者内联其定义,并始终以这种方式调用它),然后调用salign mbData1 mbData2

相关问题