gpt4 book ai didi

haskell - 如何将模式与数据结构中的特定项目联系起来?

转载 作者:行者123 更新时间:2023-12-02 18:49:53 25 4
gpt4 key购买 nike

考虑下面的简单数据结构(我正在学习如何使用 attoparsec)。我不只是自动派生 show,而是为其创建了一个实例。但是,如果 DateDefinition 中的项目顺序发生更改(例如,我将 dayOfMonth 放在 MonthOfYear 之前),该实例将立即中断(返回错误答案)。必须有一种方法将模式中的每个条目与数据结构中的每个条目关联起来,以便它不受项目顺序变化的影响。但如何呢?我尝试使用实际名称,但不出所料,这不起作用,只是导致出现有关隐藏现有绑定(bind)的警告。

data DateDefinition = DateDefinition
{
monthOfYear :: Months,
dayOfMonth :: Int,
hourOfDay :: Int,
minuteOfHour :: Int,
secondOfMinute :: Int
}

instance Show DateDefinition where
show (DateDefinition m d _ _ _) = show m ++ " " ++ show d

最佳答案

可以直接使用字段访问器;这是最简单的方法:

instance Show DateDefinition where
show dd = show (monthOfYear dd) ++ " " ++ show (dayOfMonth dd)

或者,您可以使用 RecordWildCards 扩展:

instance Show DateDefinition where
show DateDefinition{..} = show monthOfYear ++ " " ++ show dayOfMonth

如果您从不打算删除这些字段,这很好。如果您想更改内部结构而不破坏任何内容,那么第一个实现( as pointed out by rampion )可能是最安全的。只要不导出构造函数,您始终可以在任何人都不知道的情况下将这些字段变成普通函数。

关于haskell - 如何将模式与数据结构中的特定项目联系起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29753421/

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