我无法为自定义数据类型编写自己的functor实例(无法更改)。数据类型定义为:
data Foo a = Baz String (Qux -> Foo a) | Bar a
data Qux = None | Quux String
Run Code Online (Sandbox Code Playgroud)
我的问题是为该Foo类型编写一个仿函数。具体来说,我不确定如何将functor函数正确地应用于f中的函数Foo。我正在考虑以某种方式在构造函数中调用该函数,但是由于没有Qux可用的,因此我陷入了困境。
instance Functor Foo where
fmap f (Bar a) = Bar (f a)
fmap f (Baz s ???) = Baz s (???) -- What goes here?
-- Clearly, something like this doesn't work
-- fmap f (Baz s g) = Baz s (f g)
-- I've also tried something like this, but I'm not sure where to go from there
-- fmap f (Baz s (None -> Bar b)) = Baz s (f b) ???
-- fmap f (Baz s (Quux x -> Bar b)) = Baz s ???
Run Code Online (Sandbox Code Playgroud)
让我们从完成此等式的左侧开始。我们可以编写g将您的函数绑定到变量的方法。
fmap f (Baz s g) = Baz s (???)
然后,我们需要用另一个函数填充问号,该函数取a Qux并返回a Foo b。
fmap f (Baz s g) = Baz s (\q -> ???)
我们只能使用做一件事情q,这适用g于它。
fmap f (Baz s g) = Baz s (\q -> g q)
但是,这给了我们一个Foo a,但是我们需要一个Foo b!我们没有执行此操作的功能。但是,我们确实有have f,它需要一个a并返回一个b。如果只有一种方法可以a -> b将其转化为Foo a -> Foo b……哦,等等,这就是所谓的fmap!
fmap f (Baz s g) = Baz s (\q -> fmap f (g q))
如果要以无点符号(https://wiki.haskell.org/Pointfree)编写函数,则可以执行此操作。
fmap f (Baz s g) = Baz s (fmap f . g)
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |