gpt4 book ai didi

haskell - 记录语法: validate contents in constructor

转载 作者:行者123 更新时间:2023-12-02 16:12:39 24 4
gpt4 key购买 nike

我有一条包含 12 个值的记录。有一些值的组合无效,因此我希望构造函数检查这一点。我只知道如何创建接受参数列表的构造函数,但是对于 12 个值来说这并不是很漂亮。因此,我想在构造值后使用该值时使用记录语法。

如何在构造函数中强制执行约束并仍然使用记录语法?

最佳答案

我将以更详细的方式发布我的第一条评论,也许您会发现这已经足够好了。

首先,我们假设您的数据或多或少像这样:

data MyBigData = MyBigData {
a :: ...
b :: ...
...
z :: ...
}

确实,当替换为智能构造函数时,您对这个问题无能为力。

但是,假设您的库函数看起来或多或少像这样:

libFun :: MyBigData -> Result

我提出以下解决方案。创建包装类型:

newtype ValidData = ValidData MyBigData

不要导出其构造函数。将您的功能更改为:

libFun :: ValidData -> Result
libFun (ValidData d) = ...

并将验证逻辑放入函数中:

validate :: MyBigData -> Maybe ValidData

现在,当调用 validate 时,您可以使用记录语法,但如果您不先验证它,您将无法在任何实际期望它处于一致状态的函数中使用此数据。

input = validate $ MyBigData { ... }
case input of:
Just d -> libFun d
Nothing -> ...

当然,在这种情况下,validate 也可以返回Either,或者如果您需要的话,也可以单子(monad)行为。

关于haskell - 记录语法: validate contents in constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36802590/

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