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}
答案 0 :(得分:2)
您可以使用Maybe.map
来消除显式Nothing
检查的需要:
updateBox: Box -> Box
updateBox b =
{b | marble = Maybe.map (\m -> { m | vanes = Maybe.map ((+) 1) m.vanes }) b.marble}