更新嵌套的Maybe

时间:2017-04-13 16:02:42

标签: elm

嗯elm n00b。我已经读过Elm要求Maybe明确处理。那就是在处理嵌套的Maybe时,有没有一种表达事物的方式/模式"如果所有Maybe包含值然后做某事,否则给我这个默认值&#34 ;

我想Maybe.andThen,除非我不知道它是如何适合的。

我最接近类似问题的是Haskell:Simplifying nested Maybe pattern matching

可以在try-elm上运行的示例代码如下。我们对#34;盒子进行了建模,其中可能包含一个播放"大理石",可能有许多" vanes" (或长笛)在其中心。 updateBox增加叶片的数量(如果有的话)(假设它更新了此处未显示的其他值,因此名称)

我正在寻找的是一种简洁的方式:"如果大理石存在,如果它有叶片,给我一个新的大理石w /递增的叶片;否则就像大理石一样给我回复#34;。

(请注意,这可以重新构建以避免嵌套的可能遍历,但这不是问题。)

除此之外:IMO在Nothing -> Just marble评论时需要在-- why do we need Just?下面说{奇怪}。该代码已经在Just marble路径之后,所以不应该遵循该点的大理石已经是Just marble

import Html exposing (text)

main =
  text (toString (updateBox mybox))

type alias Box = 
  {marble: Maybe Marble}

type alias Marble = 
  {vanes: Maybe Int}

mybox = Box <| Just <| Marble <| Just 1

updateBox: Box -> Box
updateBox b =
  let
    updateMarble marble =
      case marble of
        Just marble ->
          case marble.vanes of
            Just vanes -> Just {marble | vanes = Just(vanes + 1)}
            Nothing -> Just marble -- why do we need Just?
        Nothing -> marble
  in
    {b | marble = updateMarble b.marble}

1 个答案:

答案 0 :(得分:2)

您可以使用Maybe.map来消除显式Nothing检查的需要:

updateBox: Box -> Box
updateBox b =
    {b | marble = Maybe.map (\m -> { m | vanes = Maybe.map ((+) 1) m.vanes }) b.marble}