Elm 如何在地图中使用可能(列表a)?

Elm 如何在地图中使用可能(列表a)?,elm,Elm,我有一个奇怪的情况,我就是想不出来 类型别名计划= {name:String ,显示:字符串 ,间隔:可能是Int ,事件:可能(列出事件) } 类型别名事件= {时间表:可能是字符串 ,间隔:可能是Int ,钩子:绳子 ,args:List(字符串,字符串) ,时间戳:Int ,到期秒数:Int } setScheduledEventDueNow:事件->计划->计划 setScheduledEventDueNow事件计划= 案件时间表 仅限活动-> {schedule | events=Li

我有一个奇怪的情况,我就是想不出来

类型别名计划=
{name:String
,显示:字符串
,间隔:可能是Int
,事件:可能(列出事件)
}
类型别名事件=
{时间表:可能是字符串
,间隔:可能是Int
,钩子:绳子
,args:List(字符串,字符串)
,时间戳:Int
,到期秒数:Int
}
setScheduledEventDueNow:事件->计划->计划
setScheduledEventDueNow事件计划=
案件时间表
仅限活动->
{schedule | events=List.map(setMatchedEventDueNow事件)events}
没有->
日程
计划
中可能有或可能没有
事件列表
,因此它被设置为
事件:可能(列表事件)

作为对已知
事件的操作的响应
我希望运行时间表上的事件(如果有),并可能返回时间表的更新事件列表

但是,我得到了以下错误:

--类型不匹配------------------------------------------src/elm/CronPixie.elm
此“case”的第一个和第二个分支生成不同类型的值。
373 |案例一览表。事件
374 |公正事件->
375 |{schedule | events=List.map(setMatchedEventDueNow event)events}
376| 
377 |没什么->
378 |>时间表
第一个分支具有以下类型:
{a |事件:列表事件}
但第二点是:
{a |事件:可能(列表事件)}
提示:“case”中的所有分支必须具有相同的类型。所以不管是哪一个
我们得到,我们总是得到相同类型的值。
在1个模块中检测到错误。
我的初学者大脑认为,因为我已经验证了确实有一个带有
case
语句的事件列表,所有这些都应该很好地映射它

但是编译器意识到它是一个简单的
List.map
,不可能是一个Maybe,因此自然会抱怨
case
的两个分支返回的内容之间的差异


你知道我该怎么解决这个问题吗?

你需要用

仅限事件->
{计划|事件=仅计划->计划
setScheduledEventDueNow事件计划=

{schedule | events=Maybe.map(List.map您需要使用

仅限事件->
{计划|事件=仅计划->计划
setScheduledEventDueNow事件计划=

{schedule | events=Maybe.map(List.map)这会起作用。更基本的问题是,在这种情况下,您是否真的需要键入
Maybe(List a)
类型?如果您的日程表上没有任何事件(即列表中没有任何内容),那么空列表就不会
[]
符合您的目的?那么您的事件可以简单地是
列表事件类型
,这将节省大量
可能。映射
案例
语句。我发现我只需要
可能
类型来处理非列表内容,例如
可能Int
,或者
可能日期
其中
表示变量able是空的。这取决于您的业务需求,但大多数情况下我认为它很好。当一个空列表满足您的需要时,可能就没有必要了。幸运的是,数据来自PHP后端,在某些情况下可能不包括
计划中的
事件
部分。我可以假设添加e空列表,这不是一个坏主意。我还考虑过在
计划中使用
Dict
,我可能会在将来某个时候对此进行调查。无论php是否发送空列表,您都可以使用空列表的想法。您只需要一个json解码器将没有事件的情况解码为空列表(假设两者在你的情况下语义等价)是的,这就是我所说的“我可以改为添加空列表,这不是一个坏主意”。如果不存在,请通过解码器添加。感谢所有帮助Chad。这会起作用。更根本的问题是你是否真的需要
可能(列表a)
在这种情况下键入?如果您的日程安排中没有任何事件(即列表中没有任何事件),则不会出现空列表
[]
符合您的目的?那么您的事件可以简单地是
列表事件类型
,这将节省大量
可能。映射
案例
语句。我发现我只需要
可能
类型来处理非列表内容,例如
可能Int
,或者
可能日期
其中
表示变量able是空的。这取决于您的业务需求,但大多数情况下我认为它很好。当一个空列表满足您的需要时,可能就没有必要了。幸运的是,数据来自PHP后端,在某些情况下可能不包括
计划中的
事件
部分。我可以假设添加e空列表,这不是一个坏主意。我还考虑过在
计划中使用
Dict
,我可能会在将来某个时候对此进行调查。无论php是否发送空列表,您都可以使用空列表的想法。您只需要一个json解码器将没有事件的情况解码为空列表(假设两者在你的情况下语义等价)是的,这就是我所说的“我可以改为添加空列表,这不是一个坏主意”。如果不存在,请通过解码器添加。感谢所有帮助。