首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新嵌套的可能

更新嵌套的可能
EN

Stack Overflow用户
提问于 2017-04-13 16:02:41
回答 1查看 525关注 0票数 0

榆树n00b.我已经读到Elm需要显式地处理Maybe。也就是说,在处理嵌套的Maybe时,是否有一种表达事物的方式/模式:“如果所有的Maybe都包含值,那么就做一些事情,否则就给我这个缺省值”?

我想Maybe.andThen,除了我看不出它怎么适合这里。

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

下面的样例代码可以在try-elm上运行。我们模拟一个“盒子”,其中可能包含一个弹奏的“大理石”,它的中心可能有许多“叶片”(或长笛)。如果有的话,updateBox会增加叶片的数量(假设它更新了这里没有显示的其他值,因此它的名称)

我要找的是一种简洁的说法:“如果大理石存在,如果它有叶片,给我一个新的大理石w/增量叶片;否则就把大理石还给我。”

(请注意,可以对其进行重组,以避免嵌套的可能遍历,但这不是问题。)

旁白:在下面的Nothing -> Just marble评论中,我觉得很奇怪。代码已经遵循了Just marble路径,所以它不应该遵循这样的说法,那一点上的大理石已经是一个Just marble

代码语言:javascript
复制
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}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-13 16:13:00

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

代码语言:javascript
复制
updateBox: Box -> Box
updateBox b =
    {b | marble = Maybe.map (\m -> { m | vanes = Maybe.map ((+) 1) m.vanes }) b.marble}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43396929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档