给出:
data MyType a = Done a | Out a (MyType a) | In (a -> MyType a)
我正在努力实现fmap f (In x)
。我最初的想法是In $ \y -> fmap f (x y)
,但是由于x
在MyType a
上运行不起作用-就像我需要某种方式来映射参数和“内部”东西一样,如果有道理。我想我正在寻找的是在给定b -> m b
的情况下从a -> m a
创建a -> b
的方法-可能吗?
答案 0 :(得分:5)
我怀疑您实际上 想要的类型是这种类型(或您选择了特定i
的某些专业化类型):
data MyType i o = Done o | Out o (MyType i o) | In (i -> MyType i o)
这里的主要区别是In
构造函数为其参数和函数所包含的结果使用单独的类型。一旦分离了这样的输入和输出参数,您应该发现Functor
实例更容易编写。