这是我的代码:
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
。那么错误来自哪里?
答案 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