list - 通过分布 [] 来简化代码

标签 list haskell monads

我有以下功能

type Assignment = [(Ref, Val)]

predi2 :: [(Val,Val)] -> Ref -> Ref -> (Maybe Assignment -> [Maybe Assignment])
predi2 f k1 k2 = \ma -> case ma of
    Nothing -> [Nothing]
    Just a -> case lookup k1 a of
        Nothing -> [Nothing]
        Just e1 -> case lookup k2 a of
            Nothing -> [Nothing]
            Just e2 -> if elem (e1, e2) f
                then [Just a]
                else []

考虑到 Maybe 的所有实例,我想我可以将它简化为 Maybe monad 中更简单的东西:

predi2 :: [(Val,Val)] -> Ref -> Ref -> (Maybe Assignment -> [Maybe Assignment])
predi2 f k1 k2 = [\ma -> do
    a <- ma
    e1 <- lookup k1 a
    e2 <- lookup k2 a
    if elem (e1, e2) f then (return a) else ???]

但我的问题是最后的 else,我不需要返回任何内容。

这就是我的问题:是否有可能以 [f a] = [] 的方式返回任何内容?

最佳答案

不,不是。

我会像这样编写你的 predi2 函数:

predi2 f k1 k2 ma = fromMaybe [Nothing] $ do
    a <- ma
    e1 <- lookup k1 a
    e2 <- lookup k2 a
    if elem (e1, e2) f then return [Just a] else return []

  • 使用 fromMaybe 对一元计算进行后处理
  • 将列表放在一元计算内部,而不是外部
  • 将 if 语句的 False 分支视为成功(根据单子(monad)计算的标准)

关于list - 通过分布 [] 来简化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15164180/

相关文章:

C 程序错误 - 段错误(核心已转储)

c# - 尝试比较两个列表 c# - 应该工作吗?

python - 与 python 中每个确切位置的列表进行比较

haskell - 模式匹配,匹配多个字符

haskell - 如何使用 putStrLn 进行跟踪(Haskell)

scala - flatMap 忽略结果

java - 如何向我的 Map<Integer>、List<String>> 添加一个值?

haskell - 使用 Haskell 在运行时解释多行代码字符串

haskell - 如何链接到 Haddock 中的指定文档 block ?

haskell - 避免显式传递查找表