Dictionary 映射(fromList)到新类型的Haskell映射函数
我试图将一个函数映射到map(from)实例上,以将其转换为一种新类型的map。具体来说,我有两种类型的地图: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) ->
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