gpt4 book ai didi

haskell - 如何处理多个但相似的记录类型

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

假设我有以下几乎相同的类型声明。这些类型彼此相关,因为 MyType2 是 MyType1 的“处理”版本。

data MyType1 = MyType1 {
field1 :: Maybe Text
manyOtherFields :: Maybe Whatever
}

data MyType2 = MyType2 {
field1 :: Text,
manyOtherFields :: Whatever
}

最初,field1 是 Maybe,因为数据来自用户输入。然而,一旦处理,它就会变成一个 Just 值。

这种将“可能”处理为“公正”的模式可能会在我的程序中重复数十次甚至数百次,并且可能有许多类似的组合描述本质上相同的实体在不同处理阶段的变化。

如何避免为所有相似的组合重复我的类型定义?

进一步说明:

在我的实际程序中,问题是接受文件作为来自网络表单的输入。当我的代码收到表单时,文件输入字段是 Maybe FilePath,因此我的数据类型如下:

data Media = Media {
filePath :: Maybe FilePath
altText :: Text,
}

处理输入后,我需要一个新的数据类型:

data Media2 = Media2 {
filePath :: FilePath
altText :: Text,
height :: Int,
width :: Int
}

这看起来丑陋且不切实际,因为类似的模式将在我的程序中一遍又一遍地重复。我很可能需要 Media3(和 4),更不用说所有其他实体及其变体了。

最佳答案

我忘记了这项技术的名称......但是,它是:

import Data.Maybe
import Data.Functor.Identity

data MyType f = MyType
{ field1 :: f Text
, manyOtherFields :: f Whatever
}
type MyType1 = MyType Maybe
type MyType2 = MyType Identity

付出的代价是在数据完全处理后使用 Identity 构造函数来包装数据。

例如:

x :: MyType1  -- partially processed
x = MyType{field1 = Nothing, manyOtherFields = Just whatever}

y :: MyType2 -- fully processed
y = MyType{field1 = Identity someText, manyOtherFields = Identity whatever}

关于haskell - 如何处理多个但相似的记录类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30262854/

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