【发布时间】:2021-09-07 17:35:15
【问题描述】:
data Color = White | Black deriving (Eq, Show)
data Role = King | Queen | Rook deriving (Eq, Show)
data Piece = Piece { color :: Color,
role :: Role } deriving (Eq)
data Piese = Piese { piece :: Piece,
coord :: Coord } deriving (Eq)
data ColorMap a = ColorMap {
white :: a,
black :: a
} deriving (Eq)
instance Functor ColorMap where
fmap fn (ColorMap white black) =
ColorMap (fn white) (fn black)
colorMapFromList :: (a -> Color) -> [a] -> ColorMap [a]
colorMapFromList fn lst = ColorMap
(filter ((== White) . fn) lst)
(filter ((== Black) . fn) lst)
data RoleMap a = RoleMap {
king :: a,
queen :: a,
rook :: a }
instance Functor RoleMap where
fmap fn (RoleMap king queen rook) =
RoleMap (fn king) (fn queen) (fn rook)
roleMapFromList :: (a -> Role) -> [a] -> RoleMap [a]
roleMapFromList fn lst = RoleMap
(filter ((== King ) . fn) lst)
(filter ((== Queen) . fn) lst)
(filter ((== Rook ) . fn) lst)
mapso :: [Piese] -> ColorMap (RoleMap [Coord])
mapso lst =
fmap (fmap (fmap coord)) -- ColorMap (RoleMap [Coord])
(fmap (roleMapFromList (role . piece)) -- ColorMap (RoleMap [Piese])
(colorMapFromList (color . piece) -- ColorMap [Piese]
lst)) -- [Piese]
我刚刚进入 Haskell,它可以编译,但对我来说似乎很容易出错。这里有一个模式我可以把它简化成吗?特别是mapso 函数。
【问题讨论】:
-
ColorMap (RoleMap [Coord])需要 ColorMap 和 RoleMap 怎么办? -
说实话,我不知道我在做什么,我只是在学习。以某种方式对数据进行分组,使其易于理解,例如制作国际象棋 AI。
-
你可能想看看 traverse hackage.haskell.org/package/base-4.15.0.0/docs/….
标签: haskell functional-programming nested functor map-function