Dictionary 映射(fromList)到新类型的Haskell映射函数

Dictionary 映射(fromList)到新类型的Haskell映射函数,dictionary,haskell,types,casting,map-function,Dictionary,Haskell,Types,Casting,Map Function,我试图将一个函数映射到map(from)实例上,以将其转换为一种新类型的map。具体来说,我有两种类型的地图: type Scope = Map.Map String AExpr type Row = Map.Map String Value 将AExpr映射到Value的函数(给定其第一个参数范围): 还有一个Scope类型的实例,比如说x,我想为其映射函数evalAExpr,以获得一个Row类型的实例 根据合同规定,仅使用以下方法即可实现: map :: (a -> b) ->

我试图将一个函数映射到map(from)实例上,以将其转换为一种新类型的map。具体来说,我有两种类型的地图:

type Scope = Map.Map String AExpr
type Row = Map.Map String Value
AExpr
映射到
Value
的函数(给定其第一个参数范围):

还有一个
Scope
类型的实例,比如说
x
,我想为其映射函数
evalAExpr
,以获得一个
Row
类型的实例

根据合同规定,仅使用以下方法即可实现:

map :: (a -> b) -> Map k a -> Map k b
因此,在我的情况下,这将是:

x :: Scope
evalAExpr :: Scope -> AExpr -> Value
y = map (evalAExpr x) x :: Row
因为
范围
具有类型
映射字符串AExpr
,而
具有类型
映射字符串值

然而,我得到了以下错误:


不知道为什么它坚持要使用AExpr列表,而不是
映射字符串AExpr
(=
Scope
)。如果有人能帮我解决我做错了什么以及如何去做,我将不胜感激

您使用了错误的
地图

“默认情况下”(这意味着它来自自动导入的模块
Prelude
)范围内的
map
)用于列表:

map :: (a -> b) -> [a] -> [b]
如果要将其用于
映射
,则需要将其导入。您可以如下方式对列表版本进行阴影处理:

import Data.Map (map)
或者,更好的方法是将
Data.Map
导入为合格,并使用
Map
进行合格:

import qualified Data.Map as M

y = M.map (evalAExpr x) x

或者,您可以使用,它是
map
的通用版本,适用于任何可以“映射”的数据结构。这种结构称为“函子”,而
Map
就是其中之一:

y = fmap (evalAExpr x) x
您也可以在运算符形式中使用它:

y = evalAExpr x <$> x
y=evalAExpr x

操作员
只是
fmap

map
的别名,仅适用于列表。使用
fmap
(适用于所有functor)或
Map.Map

y = fmap (evalAExpr x) x
y = evalAExpr x <$> x