【发布时间】:2017-07-23 21:22:18
【问题描述】:
有这种类型:
{-# LANGUAGE GADTs #-}
data Rgb a = (Num a, Show a) => Rgb a a a
我完全能够实现Show typeclass:
instance Show (Rgb a) where
show (Rgb r g b) = "Rgb (" ++ show r ++ "," ++ show g ++ "," ++ show b ++ ")"
但如果我尝试对 Functor 做同样的事情:
instance Functor (Rgb a) where
fmap f (Rgb r g b) = Rgb (f r) (f g) (f b)
我在 GHCi REPL 上得到以下输出:
<interactive>;:1093:19:
The first argument of ‘Functor’ should have kind ‘* > *’,
but ‘Rgb a’ has kind ‘*’
In the instance declaration for ‘Functor (Rgb a)’
我当然会对解决方案和解释感到满意,而且还会提供与该问题相关的深化理论的链接。
为了克服这个问题,我(暂时)编写了这个函数:
mapRgb :: (Num a, Num b, Show a, Show b) => (a -> b) -> Rgb a -> Rgb b
mapRgb f (Rgb r g b) = Rgb (f r) (f g) (f b)
但我更喜欢为Rgb 类型实现fmap。
【问题讨论】:
标签: haskell functional-programming functor