是否可以为此类型编写函子实例?

时间:2019-09-10 08:27:22

标签: haskell functor

给出:

data MyType a = Done a | Out a (MyType a) | In (a -> MyType a)

我正在努力实现fmap f (In x)。我最初的想法是In $ \y -> fmap f (x y),但是由于xMyType a上运行不起作用-就像我需要某种方式来映射参数和“内部”东西一样,如果有道理。我想我正在寻找的是在给定b -> m b的情况下从a -> m a创建a -> b的方法-可能吗?

1 个答案:

答案 0 :(得分:5)

我怀疑您实际上 想要的类型是这种类型(或您选择了特定i的某些专业化类型):

data MyType i o = Done o | Out o (MyType i o) | In (i -> MyType i o)

这里的主要区别是In构造函数为其参数和函数所包含的结果使用单独的类型。一旦分离了这样的输入和输出参数,您应该发现Functor实例更容易编写。