gpt4 book ai didi

haskell - 在 Haskell 中对结构相似类型内的值进行操作

转载 作者:行者123 更新时间:2023-12-02 17:39:22 27 4
gpt4 key购买 nike

请原谅我的 Haskell 能力极其有限。

我有一系列在不同模块中定义的数据类型,它们的结构方式相同:

-- in module Foo
data Foo = Foo [Param]

-- in module Bar
data Bar = Bar [Param]

-- * many more elsewhere

我想要一组对参数列表进行操作的函数,例如从列表中添加和删除元素(返回新的 FooBar 根据需要使用不同的参数列表)。

据我所知,即使我创建一个类型类并为每种类型创建实例,我每次都需要定义所有这些函数,即:

-- in some imported module

class Parameterized a where
addParam :: a -> Param -> a
-- ... other functions

-- in module Foo

instance Parameterization Foo where
addParam (Foo params) param = Foo (param:params)
-- ... other functions

-- in module Bar

instance Parameterization Bar where
-- this looks familiar...
addParam (Bar params) param = Bar (param:params)
-- ... other functions

这感觉很乏味——远远超过了我开始认为我做错了什么的程度。如果无论构造函数(?)如何,都无法进行模式匹配来提取值,那么如何减少这样的样板?

反驳可能的论点:是的,我知道我可以简单地拥有一组函数(addParam等),它将显式列出每个构造函数和模式匹配放置的参数--但当我以相当模块化的方式构建它时(FooBar模块非常独立),并且我正在构建一个系统原型(prototype),其中将有数十个这样的系统类型,类型构造函数的详细集中列表似乎......错误。

很有可能(可能?)我的方法只是有缺陷的,而且无论如何这都不是构建类型层次结构的正确方法 - 但因为我无法拥有单个数据 在某处键入并为每个模块中的类型添加一个新的构造函数(?)我很困惑如何获得良好的“插件”感觉,而不必每次都重新定义简单的实用函数。任何和所有善意的建议都乐意接受。

最佳答案

您可以在类型类中拥有函数的默认实现,例如

class Parameterized a where
params :: a -> [Param]
fromParams :: [Param] -> a
addParam :: a -> Param -> a
addParam x par = fromParams $ par : params x
-- ... other functions

instance Parameterized Foo where
params (Foo pars) = pars
fromParams = Foo

但是,您的设计看起来确实很可疑。

关于haskell - 在 Haskell 中对结构相似类型内的值进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1593346/

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