首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法匹配“Map k0”类型

无法匹配“Map k0”类型
EN

Stack Overflow用户
提问于 2015-07-24 16:14:54
回答 2查看 156关注 0票数 0

这是我的密码:

代码语言:javascript
复制
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

当我试图编译它时,我会得到以下错误:

代码语言:javascript
复制
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。那么,错误从哪里来呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-24 16:20:24

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

代码语言:javascript
复制
convertTile ts = map complement ts

代码语言:javascript
复制
convertTile = map complement
票数 3
EN

Stack Overflow用户

发布于 2015-07-24 16:20:56

如果我正确地理解了它,那么您将尝试使用TileSet函数来转换一个map。问题是,您正在尝试使用来自Data.Map的Data.Map,这不是您想要的:

代码语言:javascript
复制
:t M.map
M.map :: (a -> b) -> Map k a -> Map k b

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

代码语言:javascript
复制
:t map
map :: (a -> b) -> [a] -> [b]

这正是你想要的。因此,为了解决问题,请使用map而不是M.map

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31615238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档