“应用默认值”的抽象形式

时间:2014-01-15 18:03:18

标签: haskell default default-value maybe

我希望从“可用”数据类型中轻松获取值,或者在失败的情况下使用默认值。

以下是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中的情况一样,有一种更为抽象的方法,我不知道这样做。任何人吗?

2 个答案:

答案 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结合使用,您可以将最终的默认选项串联起来。