gpt4 book ai didi

haskell - 在什么情况下可以/不可以拥有数据类型的 Functor 实例?

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

考虑带有 kind * -> * 的类型,我正在尝试寻找规则并建立直觉,了解何时可以以及何时不能使用此类型的 Functor。

到目前为止,我看到的规则如下:

  1. 对于有限制的容器类型,没有 Functor 实例关于所包含的值。

示例:Set 不能有 Functor 实例,因为所包含的值需要 Ord

  • 没有逆变数据类型的Functor实例。
  • 示例:

    newtype Contra a = Contra (a -> Int)

    除此之外,还有其他情况吗?

    最佳答案

    除了您的规则之外:

    • 必须是同类* -> *
    • 没有对所包含的值有限制的容器类型的 Functor 实例。
    • 没有逆变数据类型的Functor实例。

    我想补充一些:

    • “不适用于逆变类型”的自然扩展:没有不变数据类型的仿函数实例。例如数据 Iso a b = Iso (a -> b) (b -> a)
    • GADT 通常不能有 Functor 实例。例如,

      data Foo a where
      Foo :: Foo Int

      也许您会以某种方式希望将其归入“唯一协变”规则(我不清楚这甚至有什么差异),或者以某种方式归入“不受限制的容器类型”规则(GADT 引入了非常约束的类型相等性) -类似)。

    但是,请记住,这些规则仅适用于仿函数,而不适用于一般仿函数。我希望您可以编写的任何愚蠢类型(适当的类型)都将是与 Hask 密切相关的某个合适类别的仿函数。

    关于haskell - 在什么情况下可以/不可以拥有数据类型的 Functor 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43605874/

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