我如何在地图中使用 Maybe(列表 a)?

How do I use a Maybe (List a) in a map?

我有一个奇怪的情况,我就是想不通。

type alias Schedule =
    { name : String
    , display : String
    , interval : Maybe Int
    , events : Maybe (List Event)
    }


type alias Event =
    { schedule : Maybe String
    , interval : Maybe Int
    , hook : String
    , args : List ( String, String )
    , timestamp : Int
    , seconds_due : Int
    }

setScheduledEventDueNow : Event -> Schedule -> Schedule
setScheduledEventDueNow event schedule =
    case schedule.events of
        Just events ->
            { schedule | events = List.map (setMatchedEventDueNow event) events }

        Nothing ->
            schedule

Schedule中可能有也可能没有ListEvents,所以设置为events : Maybe (List Event)

为了响应对已知 Event 的操作,我想 运行 按计划完成所有活动(如果有的话),并可能 return 更新的活动列表时间表。

但是,我收到以下错误:

-- TYPE MISMATCH ----------------------------------------- src/elm/CronPixie.elm

The 1st and 2nd branches of this `case` produce different types of values.

373|     case schedule.events of
374|         Just events ->
375|             { schedule | events = List.map (setMatchedEventDueNow event) events }
376| 
377|         Nothing ->
378|>            schedule

The 1st branch has this type:

    { a | events : List Event }

But the 2nd is:

    { a | events : Maybe (List Event) }

Hint: All branches in a `case` must have the same type. So no matter which one
we take, we always get back the same type of value.

Detected errors in 1 module.

我的初学者认为,因为我已经验证确实存在带有 case 语句的事件列表,所以映射它应该很好。

但是编译器认识到它是一个简单的 List.map,没有机会成为 Maybe,所以自然而然地抱怨 return 由 [=17] 的两个分支编辑的内容之间的差异=].

知道我如何解决这个问题吗?

您需要使用 Just

来包装列表
Just events ->
    { schedule | events = Just <| List.map (setMatchedEventDueNow event) events }

您可以使用 Maybe.map 更简洁地编写整个函数,其中 returns Nothing 如果事件列表已经是 Nothing,并映射到底层否则使用提供的函数列出:

setScheduledEventDueNow : Event -> Schedule -> Schedule
setScheduledEventDueNow event schedule =
  { schedule | events = Maybe.map (List.map <| setMatchedEventDueNow event) schedule.events }