gpt4 book ai didi

haskell - 在 Haskell 中链接/组合类型类

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

假设我有两个类型类定义如下,它们功能相同但名称不同:

class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a

class PhantomMonad p where
pbind :: p a -> (a -> p b) -> p b
preturn :: a -> p a

有没有办法将这两个类联系在一起,所以作为 PhantomMonad 实例的东西将自动成为 Monad 的实例,或者每个类的实例都必须显式编写?任何见解将不胜感激,谢谢!

最佳答案

好答案:不,您希望做的事情实际上并不可行。您可以编写一个看起来像您想要的那样的实例,在此过程中可能需要一些 GHC 扩展,但它不会按照您希望的方式工作。

不明智的回答:您可能可以使用可怕的类型级元编程来完成您想要的事情,但它可能会变得复杂。除非您出于某种原因绝对需要此功能,否则不建议这样做。

官方的实例不能真正依赖其他实例,因为 GHC 在做决定时只看“实例头”,而类约束在“上下文”中。要在此处创建类似“类型类同义词”的内容,您必须编写看起来像 Monad 的实例的内容。对于所有可能的类型,这显然没有意义。您将与 Monad 的其他实例重叠。 ,这有它自己的问题。

最重要的是,我认为这样的实例不会满足实例解析的终止检查要求,因此您还需要 UndecidableInstances扩展,这意味着能够编写将 GHC 的类型检查器发送到无限循环的实例。

如果你真的想去那个兔子洞,请浏览 Oleg Kiselyov's website一点点;他是 Haskell 中类型级元编程的守护神。

可以肯定的是,这很有趣,但如果你只是想编写代码并让它工作,可能不值得那么痛苦。

编辑:好吧,事后看来,我在这里夸大了这个问题。像 PhantomMonad考虑到 Overlapping,一次性工作正常,应该做你想做的事- 和 UndecidableInstances GHC 扩展。当你想做比问题更复杂的事情时,复杂的事情就开始了。我真诚地感谢 Norman Ramsey 给我打电话——我真的应该知道得更好。

我仍然不建议在没有充分理由的情况下做这种事情,但这并不像我说的那么糟糕。过失。

关于haskell - 在 Haskell 中链接/组合类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2877304/

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