gpt4 book ai didi

haskell - 存在类型类 vs. 数据构造函数 vs. 副产品

转载 作者:行者123 更新时间:2023-12-05 00:46:56 26 4
gpt4 key购买 nike

我发现自己在我的设计中遇到了相同的模式,我从一个具有几个数据构造函数的类型开始,最终希望能够针对这些数据构造函数进行输入,从而将它们拆分为自己的类型,然后必须增加在我仍然需要表示多个这些类型(即集合)的情况下,需要使用任何一个或另一个标记联合来减少程序其他部分的冗长。

我希望有人能指出我完成我正在尝试做的事情的更好方法。让我从一个简单的例子开始。我正在建模一个测试系统,您可以在其中拥有最终以测试结束的嵌套测试套件。所以,像这样:

data Node =
Test { source::string }
Suite { title::string, children::[Node] }

所以,到目前为止非常简单,本质上是一个花哨的 Tree/Leaf 声明。但是,我很快意识到我希望能够制作专门用于测试的功能。因此,我现在将其拆分如下:
data Test = Test { source::string }
data Suite = Suite { title::string, children::[Either Test Suite] }

或者,我可能会推出“自定义”选项(特别是如果示例更复杂并且有 2 个以上的选项),请说如下:
data Node =
fromTest Test
fromSuite Suite

所以,能够拥有一个 Suite 已经很不幸了。可以有套件或测试的组合我最终会得到一个奇怪的开销 Either类(无论是实际的 Either 还是自定义的)。如果我使用存在类型类,我可以避免同时使用 TestSuite派生“Node_”然后有 Suite拥有一个列表说 Node s。副产品将允许类似的事情,我基本上会做同样的事情 Either没有冗长标签的策略。

现在让我用一个更复杂的例子来扩展。测试的结果可以是跳过(测试被禁用)、成功、失败或忽略(由于先前的失败,测试或套件无法运行)。同样,我最初是从这样的事情开始的:
data Result = Success | Omitted | Failure | Skipped
data ResultTree =
Tree { children::[ResultTree], result::Result } |
Leaf Result

但我很快意识到我希望能够编写获取特定结果的函数,更重要的是,让类型本身强制执行所有权属性:成功的套件必须只拥有 Success 或 Skipped 子项,Failure 的子项可以是任何东西,Omitted 只能自己省略等所以现在我最终得到这样的结果:
data Success = Success { children::[Either Success Skipped] }
data Failure = Failure { children::[AnyResult] }
data Omitted = Omitted { children::[Omitted] }
data Skipped = Skipped { children::[Skipped] }
data AnyResult =
fromSuccess Success |
fromFailure Failure |
fromOmitted Omitted |
fromSkipped Skipped

同样,我现在有这些奇怪的“包装器”类型,例如 AnyResult ,但是,我得到了一些过去只能从运行时操作中强制执行的类型强制执行。是否有更好的策略不涉及打开诸如存在类型类之类的功能?

最佳答案

读到你的句子时,我想到的第一件事是:“我很快意识到我希望能够编写具有特定结果的函数”是 细化类型 .

它们只允许从类型中获取一些值作为输入,并使这些约束成为编译时检查/错误。

有一段来自 HaskellX 2018 演讲的视频,介绍了 LiquidHaskell,它允许在 Haskell 中使用细化类型:

https://skillsmatter.com/skillscasts/11068-keynote-looking-forward-to-niki-vazou-s-keynote-at-haskellx-2018

你必须装饰你的 haskell 函数签名,并安装 LiquidHaskell:
f :: Int -> i : Int {i | i < 3} -> Int将是一个只能接受 Int 作为第二个参数的函数带有值 < 3 , 在编译时检查。

您不妨对您的 Result 进行限制。类型。

关于haskell - 存在类型类 vs. 数据构造函数 vs. 副产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52973009/

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