Извините за мой крайне ограниченный Haskell-fu.
У меня есть серия data
типов, определенных в разных модулях, которые структурированы одинаково:
-- in module Foo
data Foo = Foo [Param]
-- in module Bar
data Bar = Bar [Param]
-- * many more elsewhere
Я хотел бы иметь набор функций, которые работают со списком параметров, например, для добавления и удаления элементов из списка (возвращая новый Foo
или Bar
с другим списком параметров, в зависимости от ситуации).
Насколько я могу судить, даже если я создам класс типов и экземпляры для каждого типа, мне нужно будет каждый раз определять все эти функции, то есть:
-- 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
и т. Д.), Который явно перечислял бы каждый конструктор и сопоставление с шаблоном, поместите параметры - но поскольку я строю это довольно модульно ( модули Foo
и Bar
довольно автономны), и я создаю прототип системы, в которой будут десятки этих типов, подробный централизованный список конструкторов типов кажется ... неправильным.
Вполне возможно (вероятно?), Что мой подход просто ошибочен и что это не совсем правильный способ структурировать иерархию типов, но поскольку у меня не может быть где-то одного типа data
и добавить новый конструктор для тип в каждом из этих модулей (?) Я не понимаю, как добиться приятного ощущения «плагина» без необходимости каждый раз переопределять простые служебные функции. Любые добрые предложения с радостью принимаются.