无法匹配“地图k0”类型

时间:2015-07-24 16:14:55

标签: haskell

这是我的代码:

import Data.Map as M

data Tile = A | T | G | C
type TileSet = [Tile]

complement :: Tile -> Tile
complement A = T
complement T = A
complement G = C
complement C = G
complement x = A

convertTile :: TileSet -> TileSet
convertTile [] = []
convertTile ts = M.map complement ts

当我尝试编译时,我收到以下错误:

Couldn't match type ‘Map k0 Tile’ with ‘[Tile]’
Expected type: TileSet
Actual type: Map k0 Tile
In the expression: M.map complement ts
In an equation for ‘convertTile’:
convertTile ts = M.map complement ts

我的理解是Map有一个(a -> b) -> a -> b签名。 complement返回一个Tile,表面上ts将是TileSet。那么错误来自哪里?

2 个答案:

答案 0 :(得分:3)

Data.Map.map的类型为(a -> b) -> (Map k a) -> (Map k b),因此您需要提供Map k Tile作为第二个参数。您提供了[Tile]列表,因此您只需使用Prelude.map

convertTile ts = map complement ts

convertTile = map complement

答案 1 :(得分:1)

如果我理解正确,那么您正尝试使用map函数转换TileSet。问题是你试图使用Data.Map中的map,这不是你想要的:

:t M.map
M.map :: (a -> b) -> Map k a -> Map k b

因此,它需要一个函数(a -> b)和一个Map k a作为输入,因此您得到Map k b。你真正想要使用的是一个简单的map

:t map
map :: (a -> b) -> [a] -> [b]

完全符合您的要求。因此,为了解决您的问题,请使用map代替M.map