0

我想轻松地从“失败”数据类型中取出一个值,或者在失败的情况下使用默认值。

这是我的实现Maybe

infixr 1 <||>
(<||>) :: Maybe a -> a -> a
(<||>) = flip fromMaybe

pred :: String -> String -> Bool
pred x name = (x ==) <$> name `lookup` myMap <||> False

predTrue如果name映射到xin则返回myMap

但是就像在 Haskell 中通常的情况一样,有一种我不知道的更抽象的方法来做到这一点。任何人?

4

2 回答 2

4

Foldable可能是标准库中的一个合理选择:

import Data.Foldable

infixr 1 <||>
(<||>) :: Foldable f => f a -> a -> a

v <||> a =
    case toList v of
        [] -> a
        (x:xs) -> x

这确实意味着您必须决定是采用找到的“第一个”元素还是“最后一个”元素。同样不幸的是,它还没有Either实例,尽管它来自 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
于 2014-01-15T18:56:39.617 回答
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,您可以将可能的选择与最后的默认值串在一起。

于 2014-01-15T18:30:28.577 回答