gpt4 book ai didi

elm - 是否可以在自定义类型的标签上使用 "case ... of"语句?

转载 作者:行者123 更新时间:2023-12-04 19:25:58 26 4
gpt4 key购买 nike

我想编写一个对自定义类型进行编码的函数 Decision a成 JSON。 a标签可以是例如AcceptReject ,我希望我的函数根据标签的类型调用其他函数。

我试过写 case ... of声明均在 Decision 方面类型以及标签,但无法使任何一种方法起作用。

这是我的类型:

type Decision a
= Decision Metadata a


type Accepted
= Accepted AcceptDetails


type Rejected
= Rejected RejectDetails


type alias Metadata =
{ time : Time.Posix }


type alias AcceptDetails =
{ comment : String }


type alias RejectDetails =
{ reasonCode : Int }

现在我想编写一个可以采取任何一种决策的编码器。类似的东西:
encoder : Decision a -> Json.Encode.Value
encoder decision =
case decision of
Decision _ (Accepted _) ->
acceptedEncoder decision

Decision _ (Rejected _) ->
rejectedEncoder decision

这不起作用,但希望它传达了我想要的 - 将编码任务路由到适当的功能。

这可能吗?还是我必须以另一种方式解决它,例如通过根据决策类型直接调用正确的编码器?

我认为 a 有一个问题可以是任何东西,但是,也许天真,这可以通过添加 _ 来处理。情况也是如此。

编译器给出错误信息:
The first pattern is trying to match `Decision` values of type:

Decision Accepted

But the expression between `case` and `of` is:

Decision a

最佳答案

如果aDecision a只会是 ApprovedRejected类型,似乎将两个构造函数合并为一个类型是合适的。

type DecisionResult
= Accepted AcceptDetails
| Rejected RejectDetails

这将消除对 Decision 上的类型参数的需要。 :
type Decision
= Decision Metadata DecisionResult

您的 encoder然后功能可以将决策元数据和批准/拒绝的详细信息路由到更具体的编码器:
encoder : Decision -> Json.Encode.Value
encoder (Decision meta result) =
case result of
Accepted details ->
acceptedEncoder meta details

Rejected details ->
rejectedEncoder meta details

acceptedEncoder : Metadata -> AcceptDetails -> Json.Encode.Value
acceptedEncoder meta details =
...

rejectedEncoder : Metadata -> RejectDetails -> Json.Encode.Value
rejectedEncoder meta details =
...

关于elm - 是否可以在自定义类型的标签上使用 "case ... of"语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57180041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com