我如何在地图中使用 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
中可能有也可能没有List
的Events
,所以设置为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 }
我有一个奇怪的情况,我就是想不通。
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
中可能有也可能没有List
的Events
,所以设置为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 }