我有以下功能
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/