我正在学习基本类型课程并编写了自己的实现functor
适合我的类型Test a
(行为就像Maybe
):
data Test a = Test a | Emp
class FC c a where
t :: (a -> b) -> c a -> c b
instance FC Test a where
t f (Test a) = Test (f a)
t f (Emp) = Emp
instance FC Maybe a where
t f (Just a) = Just (f a)
t f (Nothing) = Nothing
是否有可能实现类似的东西:
instance FC c where
t f (c v) = c (f v)
Error:
Parse error in pattern: c
换句话说,抽象出类型构造函数,替换为c
and v
,因此创建一个可以应用于具有上下文的任何值的通用实例?
正如你所了解到的,c a
不是语法上有效的模式。但将你的问题作为功能提案来阅读:这将如何运作?不是每个Functor
有一个单元素构造函数,可以根据您的模式进行映射。一些例子:
data Pair a = Pair a a -- more than one element
instance Functor Pair where
fmap f (Pair x y) = Pair (f x) (f y)
data Proxy a = Proxy -- no elements
instance Functor Proxy where
fmap f Proxy = Proxy
newtype Cont r a = Cont { runCont :: (a -> r) -> r } -- element appears in a double-negative position
instance Functor (Cont r) where
fmap f (Cont g) = Cont (g . (. f))
无论如何,我认为“通用实例”的想法确实没有意义。该实例是您放置特定于类型的代码的位置。 (它必须去某个地方!)
如果你想在写作上少花点力气Functor
您可以使用 GHC 的实例DeriveFunctor
扩大。
{-# LANGUAGE DeriveFunctor #-}
data Pair a = Pair a a deriving Functor
data Proxy a = Proxy deriving Functor
newtype Cont r a = Cont { runCont :: (a -> r) -> r } deriving Functor
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)