【问题标题】:Haskell map function over a map (fromList) to new typeHaskell 映射函数将映射(fromList)映射到新类型
【发布时间】:2020-05-16 05:19:25
【问题描述】:

我正在尝试将函数映射到 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 类型的实例。

根据documentation,这应该可以简单地使用:

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 )。如果有人可以帮助我解决我做错了什么以及如何解决这个问题,我们将不胜感激!

【问题讨论】:

    标签: dictionary haskell types casting map-function


    【解决方案1】:

    你使用了错误的map

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

    map :: (a -> b) -> [a] -> [b]
    

    如果你想为Map 使用一个,你需要导入它。您可以像这样隐藏列表版本:

    import Data.Map (map)
    

    或者,一种更好的方法,将Data.Map 导入为合格,并使用map 和合格:

    import qualified Data.Map as M
    
    y = M.map (evalAExpr x) x
    

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

    y = fmap (evalAExpr x) x
    

    你也可以用运算符的形式来使用它:

    y = evalAExpr x <$> x
    

    运算符&lt;$&gt; 只是fmap 的别名。

    【讨论】:

      【解决方案2】:

      map 仅适用于列表。使用fmap(适用于所有仿函数)或Map.map

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-22
        • 1970-01-01
        相关资源
        最近更新 更多