为什么此函数的 class 实例无法接受此结构保留 "fmap"?
Why this structure-preserving "fmap" cannot be acepted in this Functor's class instance?
下面定义的函数 mapRightR 仅更改地图的设置内容,而不更改键并生成有效的关系类型。
是真的不能使用这个高级函数来定义Functor Relation实例,还是我的实现有误
{-# LANGUAGE GADTs #-}
import Data.Map as M
import Data.Set as S
data Relation a b where
R :: (Ord a, Ord b) => Map a (Set b) -> Relation a b
instance Functor Relation where
fmap f r = mapRightR f r
mapRightR :: Ord b1 => (b2 -> b1) -> Relation a b2 -> Relation a b1
mapRightR f (R r) = R $ M.map (S.map f) r
谢谢,chepner。
我尝试了 Relation 的另一种定义,使用 List 而不是 Set,它起作用了!
data Relation a b where
R :: (Ord a) => Map a [b] -> Relation a b
instance Functor (Relation a) where
fmap f r = mapRightR f r
mapRightR :: (b2 -> b1) -> Relation a b2 -> Relation a b1
mapRightR f (R r) = R $ M.map (L.map f) r
mapRightR
受到限制,它不适用于 any 类型 b
,因为 fmap
要求:
-- Specialized for f ~ Relation c
fmap :: (a -> b) -> Relation c a -> Relation c b
但是
mapRightR :: Ord b => (a -> b) -> Relation c a -> Relation c b
更明确地说,Relation c
不是将 Hask 映射到 Hask 的内函子(这是 Functor
typeclass represents),而是一个仿函数,它映射 Hask 的子类别,仅由具有 Ord
个实例的类型组成,到 Hask. (我想我的描述是正确的;欢迎指正。)
下面定义的函数 mapRightR 仅更改地图的设置内容,而不更改键并生成有效的关系类型。
是真的不能使用这个高级函数来定义Functor Relation实例,还是我的实现有误
{-# LANGUAGE GADTs #-}
import Data.Map as M
import Data.Set as S
data Relation a b where
R :: (Ord a, Ord b) => Map a (Set b) -> Relation a b
instance Functor Relation where
fmap f r = mapRightR f r
mapRightR :: Ord b1 => (b2 -> b1) -> Relation a b2 -> Relation a b1
mapRightR f (R r) = R $ M.map (S.map f) r
谢谢,chepner。
我尝试了 Relation 的另一种定义,使用 List 而不是 Set,它起作用了!
data Relation a b where
R :: (Ord a) => Map a [b] -> Relation a b
instance Functor (Relation a) where
fmap f r = mapRightR f r
mapRightR :: (b2 -> b1) -> Relation a b2 -> Relation a b1
mapRightR f (R r) = R $ M.map (L.map f) r
mapRightR
受到限制,它不适用于 any 类型 b
,因为 fmap
要求:
-- Specialized for f ~ Relation c
fmap :: (a -> b) -> Relation c a -> Relation c b
但是
mapRightR :: Ord b => (a -> b) -> Relation c a -> Relation c b
更明确地说,Relation c
不是将 Hask 映射到 Hask 的内函子(这是 Functor
typeclass represents),而是一个仿函数,它映射 Hask 的子类别,仅由具有 Ord
个实例的类型组成,到 Hask. (我想我的描述是正确的;欢迎指正。)