gpt4 book ai didi

haskell - 跨类型构造函数编写通用仿函数实例?

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

我正在学习基本类型类,并为我的类型 Test a 编写了自己的 functor 实现(行为就像 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)

错误:

Parse error in pattern: c

换句话说,抽象出类型构造函数,替换为 cv,从而创建一个可以应用于具有上下文的任何值的通用实例?

最佳答案

正如您所知,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

关于haskell - 跨类型构造函数编写通用仿函数实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42026435/

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