【问题标题】:Extracting the first Just value from [Maybe a]从 [Maybe a] 中提取第一个 Just 值
【发布时间】:2016-07-24 11:39:20
【问题描述】:

假设我有一个类似的列表:

[Nothing, Just 1, Nothing, Just 2]

我想获取第一个Just(非错误)值;在这种情况下,它是Just 1。我唯一能想到的是:

firstJust xs = case filter isJust xs of
                 []     -> Nothing
                 Just x -> Just x

有没有更好的/monad-generic 方法来做到这一点?

【问题讨论】:

    标签: haskell monads maybe


    【解决方案1】:
    import Data.Foldable (find)
    import Data.Maybe (isJust)
    import Control.Monad (join)
    
    firstJust = join . find isJust
    

    用法:

    > firstJust [Nothing, Just 1, Nothing, Just 2]
    Just 1
    
    > firstJust [Nothing, Nothing]
    Nothing
    

    【讨论】:

      【解决方案2】:

      msum 来自Control.Monad

      \> msum [Nothing, Just 1, Nothing, Just 2]
      Just 1
      

      asum 来自Data.Foldable

      \> asum [Nothing, Just 1, Nothing, Just 2]
      Just 1
      

      两者都记录为:

      动作集合的总和,泛化concat

      带签名:

      msum :: (Foldable t, MonadPlus m) => t (m a) -> m a
      asum :: (Foldable t, Alternative f) => t (f a) -> f a
      

      并且由于Maybe instance of Alternative而表现如上。

      【讨论】:

      • Maybe切换到First,你可以直接使用fold
      • 似乎需要firstJust xs = asum xs <|> Nothing 来处理空列表。
      • @StevenShaw asum ([] :: [Maybe Int])Nothing 所以空列表没问题。
      • @dfeuer 这样做的好处是你可以用同样的方法使用Last
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      相关资源
      最近更新 更多