2017-04-13 82 views
0

elm n00b。我讀過榆樹要求Maybe明確處理。這就是說,當處理嵌套Maybe s時,有沒有一種表達方式/模式來表示「如果所有的Maybe都包含值然後做某事,否則給我這個默認值」?更新嵌套的Maybe

我想Maybe.andThen除了我不明白它會適合在這裏。

我來到一個類似的問題,最近的是在Haskell:可以在試穿榆樹運行Simplifying nested Maybe pattern matching

示例代碼如下。我們模擬一個「盒子」,它可能包含一個彈奏的「大理石」,它的中心可能有許多「葉片」(或長笛)。 updateBox增加葉片的數量(假設它更新了其他值,因此沒有在這裏顯示,因此得名)

我在找的是一個簡潔的方式來說:「如果大理石存在,並且它有葉片,給我一個新的大理石w /增加葉片;否則讓我回大理石「。

(請注意,這可能會進行重組,以避免嵌套也許遍歷,但是這不是問題。)

旁白: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} 
+0

據透露你不需要通過參數傳遞給在let塊的功能,你可以直接訪問,如果他們你要。 'updateBox b = let updateMarble = case b.marble of' – farmio

回答

2

您可以使用Maybe.map來消除明確Nothing檢查的需求:

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

Thanx,Chad!我需要RTFM。 – pakx