gpt4 book ai didi

haskell - 在haskell中记录具有多个构造函数的类型

转载 作者:行者123 更新时间:2023-12-03 15:24:32 25 4
gpt4 key购买 nike

很多时候,当我使用 Haskell 编写东西时,我需要具有多个构造函数的记录。
例如。我想开发某种逻辑方案建模。我想出了这样的类型:

data Block a = Binary {
binOp :: a -> a -> a
, opName :: String
, in1 :: String
, in2 :: String
, out :: String
} | Unary {
unOp :: a -> a
, opName :: String
, in_ :: String
, out :: String
}

它描述了两种类型的 block :二元(如与,或等)和一元(如非)。它们包含核心功能、输入和输出信号。

另一个例子:键入来描述控制台命令。
data Command = Command { info :: CommandInfo
, action :: Args -> Action () }
| FileCommand { info :: CommandInfo
, fileAction :: F.File -> Args -> Action ()
, permissions :: F.Permissions}

FileCommand 需要额外的字段 - 所需的权限及其操作接受文件作为第一个参数。

当我阅读和搜索有关 Haskell 的主题、书籍等时,似乎同时使用具有记录语法和许多构造函数的类型并不常见。

所以问题是:这种“模式”不是haskell-way吗?为什么?如果是这样,如何避免呢?

附言建议的布局中哪个更好,或者可能有更易读的布局?因为我在其他来源中找不到任何示例和建议。

最佳答案

当事情开始变得复杂时,分而治之。通过组合更简单的实体来创建复杂的实体,而不是将所有功能拼凑到一个地方。这已被证明是一般编程的最佳方法,而不仅仅是在 Haskell 中。

您的两个示例都可以从分离中受益。例如。

data Block a = BinaryBlock (Binary a) | UnaryBlock (Unary a)

data Binary a = Binary {
...
}
data Unary = Unary {
...
}

现在你有 BinaryUnary分离,您可以单独为它们中的每一个编写专用函数。这些功能将更简单,更容易推理和维护。

您还可以受益于将这些类型放在单独的模块中,这将解决字段名称冲突。 Block 的最终 API将是关于非常简单的模式匹配和转发到 Binary 的专门功能和 Unary .

这种方法是可扩展的。无论您的实体或问题多么复杂,您始终可以自由地添加另一个层次的分解。

关于haskell - 在haskell中记录具有多个构造函数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23955613/

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