好的答案:不,您希望做的事情实际上并不可行。您可以编写一个看起来像您想要的那样的实例,在此过程中可能需要一些 GHC 扩展,但它不会按照您希望的方式工作。
不明智的回答:您可能可以使用可怕的类型级元编程来完成您想要的事情,但它可能会变得复杂。除非您出于某种原因绝对需要此功能,否则不建议这样做。
官方的实例不能真正依赖其他实例,因为 GHC 在做决定时只看“实例头”,而类约束在“上下文”中。要在这里制作类似“类型类同义词”的东西,您必须Monad
为所有可能的类型编写看起来像的实例,这显然没有意义。您将与 的其他实例重叠Monad
,这有其自身的问题。
最重要的是,我认为这样的实例不会满足实例解析的终止检查要求,因此您还需要UndecidableInstances
扩展,这意味着能够编写将 GHC 的类型检查器发送到无限循环的实例.
如果您真的想深入那个兔子洞,请浏览一下Oleg Kiselyov 的网站;他是 Haskell 中类型级元编程的守护神。
可以肯定的是,这很有趣,但如果你只是想编写代码并让它工作,可能不值得那么痛苦。
编辑:好的,事后看来,我在这里夸大了这个问题。考虑到- 和GHC 扩展,类似的东西PhantomMonad
一次性工作得很好,应该做你想做的事。当你想做比问题更复杂的事情时,复杂的事情就开始了。我真诚地感谢 Norman Ramsey 给我打电话——我真的应该知道得更好。Overlapping
UndecidableInstances
我仍然不建议在没有充分理由的情况下做这种事情,但这并不像我说的那么糟糕。过失。