Я пытаюсь отобразить функцию на экземпляр Map (из Data.Map ), чтобы преобразовать ее в новый тип Map. В частности, у меня есть 2 типа карт:
type Scope = Map.Map String AExpr
type Row = Map.Map String Value
Функция, которая отображает AExpr
на Value
(с учетом первого аргумента Scope):
evalAExpr :: Scope -> AExpr -> Value
И экземпляр типа Scope
, скажем x
, для которого я хочу отобразить функцию evalAExpr
, чтобы получить экземпляр типа Row
.
Согласно документации this должно быть возможно просто используя:
map :: (a -> b) -> Map k a -> Map k b
Так что в моем случае это будет:
x :: Scope
evalAExpr :: Scope -> AExpr -> Value
y = map (evalAExpr x) x :: Row
Так как Scope
имеет тип Map String AExpr
, а Row
имеет тип Map String Value
.
Тем не менее, я получаю следующую ошибку:
* Couldn't match type `Map.Map String AExpr' with `[AExpr]'
Expected type: [AExpr]
Actual type: Scope
* In the second argument of `map', namely `g'
In the expression: map (evalAExpr g) g
In an equation for r': r' = map (evalAExpr g) g | 43 | r' = map (evalAExpr g) g
Не знаю, почему он настаивает на ожидании списка AExpr вместо Map String AExpr
(= Scope
). Если бы кто-нибудь мог помочь мне в том, что я делаю неправильно и как go об этом, это было бы очень ценно!