我希望从“可用”数据类型中轻松获取值,或者在失败的情况下使用默认值。
以下是Maybe
的实施方式:
infixr 1 <||>
(<||>) :: Maybe a -> a -> a
(<||>) = flip fromMaybe
pred :: String -> String -> Bool
pred x name = (x ==) <$> name `lookup` myMap <||> False
如果pred
映射到True
中的name
,则 x
会返回myMap
。
但正如Haskell中的情况一样,有一种更为抽象的方法,我不知道这样做。任何人吗?
答案 0 :(得分:4)
Foldable
可能是标准库中的合理选择:
import Data.Foldable
infixr 1 <||>
(<||>) :: Foldable f => f a -> a -> a
v <||> a =
case toList v of
[] -> a
(x:xs) -> x
这确实意味着您必须决定是采用“第一个”元素还是“最后一个”元素。还不幸的是,它还没有Either
个实例,尽管它是coming in GHC 7.8/base 4.7。在此期间,您可以自己定义:
instance Foldable (Either a) where
foldMap _ (Left _) = mempty
foldMap f (Right y) = f y
foldr _ z (Left _) = z
foldr f z (Right y) = f y z
答案 1 :(得分:0)
以下是我提出的建议:
class Defaultable f where
infixr 1 <||>
(<||>) :: f a -> a -> a
instance Defaultable Maybe where
(<||>) = flip fromMaybe
instance Defaultable (Either a) where
(Left _) <||> x = x
(Right x) <||> _ = x
与Alternative
结合使用,您可以将最终的默认选项串联起来。