我有12个值的记录.有一些值无效的组合,所以我希望构造函数检查这一点.我只知道如何制作带有参数列表的构造函数,但是对于12个值来说这不是很漂亮.因此,我想在构造它之后使用该值时使用记录语法.
如何在构造函数中强制执行约束并仍然使用记录语法?
我将以更详细的方式发布我的第一条评论,也许你会发现这已经足够好了.
首先,让我们假设您的数据看起来或多或少像这样:
data MyBigData = MyBigData {
a :: ...
b :: ...
...
z :: ...
}
Run Code Online (Sandbox Code Playgroud)
实际上,当用智能构造函数替换时,你不能对这个问题做很多事情.
但是,假设您的库函数看起来或多或少像这样:
libFun :: MyBigData -> Result
Run Code Online (Sandbox Code Playgroud)
我提出以下解决方案.创建包装类型:
newtype ValidData = ValidData MyBigData
Run Code Online (Sandbox Code Playgroud)
不要导出其构造函数.将您的功能更改为:
libFun :: ValidData -> Result
libFun (ValidData d) = ...
Run Code Online (Sandbox Code Playgroud)
并将验证逻辑放在一个函数中:
validate :: MyBigData -> Maybe ValidData
Run Code Online (Sandbox Code Playgroud)
现在打电话时validate,您可以使用记录语法,但你将无法在实际期望它的相干态,如果你不先验证它的任何功能,使用该数据.
input = validate $ MyBigData { ... }
case input of:
Just d -> libFun d
Nothing -> ...
Run Code Online (Sandbox Code Playgroud)
当然,在这种情况下validate,Either如果你需要,也可以返回或者单独行动.
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |