这是我的密码:
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。那么,错误从哪里来呢?
发布于 2015-07-24 16:20:24
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发布于 2015-07-24 16:20:56
如果我正确地理解了它,那么您将尝试使用TileSet函数来转换一个map。问题是,您正在尝试使用来自Data.Map的Data.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
https://stackoverflow.com/questions/31615238
复制相似问题