可能的目标是为 Haskell 中新定义的数据类型创建一个新的 Semigroup 类型类实例(对于那些知道Will Kurt 的“Get programming with Haskell”一书的人,我可以参考第 428 页,即顶点项目的结尾5 与锻炼扩展)。
有一个新定义的数据类型:
data HINQ m a b = HINQ (m a -> m b) (m a) (m a -> m a)
| HINQ_ (m a -> m b) (m a)
此数据类型指定类似 SQL 的查询,其中m
定义上下文(Monad 或 Alternative),(m a -> m b)
是目标类似于 SQL 函数的函数SELECT
,即定义想要在数据库中看到的属性类型,(m a)
是一个“表”,应用前面的函数(类似于 SQL 的table_name),最后(m a -> m a)
过滤掉正在寻找的属性(类似于 SQL 的WHERE
)。
我的目标是使这个数据类型成为一个半群(最后是一个 Monoid)的实例。值得一提的是,所有需要的 Semigroup 实例a
都是b
假设的。
instance (Semigroup a, Semigroup (m a), Semigroup b,...) =>
Semigroup (HINQ m a b) where
(<>) (HINQ func1 start1 test1)
(HINQ func2 start2 test2) =
所以它的粗略想法(在背景上看得更清楚)是可以将数据库的几个不同查询组合成一个查询,但我想不出如何合并两个不同的功能同时输入(m a -> m b)
一个合并两个表(m a)
...第一个想法是将它们合并到列表中,但是类型签名发生了变化,我还没有找到解决这个问题的方法。