【问题标题】:How to return Data.Map from function如何从函数返回 Data.Map
【发布时间】:2010-12-06 09:37:00
【问题描述】:

此功能有效:

serialExpansion num = Map.fromList (zip (listOfSimpleDividers num) (powers num))

但是当我打结时:

serialExpansion :: Int -> Map
serialExpansion num = Map.fromList (zip (listOfSimpleDividers num) (powers num))

我得到了错误:

simplifier.hs:46:26: Not in scope: type constructor or class `Map'

我必须如何声明函数?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    Map 是参数化数据类型(也称为abstract data type)。只有为键指定类型并为值指定类型时,才能获得完全定义的类型。

    例如,可以让您通过Integers 查找Strings 的地图具有Map Integer String 类型。

    此外,您似乎已经导入了符合条件的 Map(您应该这样做)。因此,您必须在签名中使用Map.Map 而不仅仅是Map

    因此,你的函数应该有一个类似的签名

     serialExpansion :: Int -> Map.Map Key Value
    

    其中Key 是键数据类型,Value 是值数据类型。在你的情况下,如果我猜的话,也许你想要Int 用于KeyValue。准确地说:您希望Key 与列表listOfSimpleDividers num 中的元素类型相同,并且Value 与列表powers num 中的元素类型相同。 (如果不清楚,检查 Map.fromList 的类型签名可能会有所帮助。

    现在你可能会问:“但如果你能分辨出serialExpansion 的正确返回类型,为什么编译器不能?”它可以。这正是您的第一个示例有效的原因。由于您省略了类型签名,因此编译器从上下文中推断出它。正如您刚刚体验到的那样,编写类型签名是确保您完全理解代码(而不是依赖于类型推断)的好方法。

    【讨论】:

    • 参数化数据类型(也称为抽象数据类型)-“参数化”和“抽象”不一样。它们是独立的概念 - 数据类型可能是其中之一或两者兼而有之。
    【解决方案2】:

    两点补充gspr的回答:

    通常的做法是导入类型构造函数Map不合格,然后导入合格的模块的其余部分:

    import Data.Map (Map)
    import qualified Data.Map as Map
    

    这使您可以避免在任何地方的类型签名中写入Map.Map

    此外,在 GHCi 或 Hugs 中,您可以使用 :t 向交互环境询问任何函数的推断类型。例如,如果我在 GHCi 中加载这个文件:

    import Data.Map (Map)
    import qualified Data.Map as Map
    
    serialExpansion num = Map.fromList (zip (listOfSimpleDividers num) (powers num))
      where
        powers = undefined
        listOfSimpleDividers = undefined
    

    我得到以下信息:

    *Main> :t serialExpansion
    serialExpansion :: (Ord k) => t -> Map k a
    

    如果您插入自己的 powerslistOfSimpleDividers 定义,您将获得更具体的类型。

    【讨论】:

      【解决方案3】:

      我只是想获得一张没有任何内容的地图,然后以更灵活的方式添加到其中。

      如果你想做类似的事情,你需要Map.empty(假设你已经导入合格)。

      【讨论】:

        猜你喜欢
        • 2022-08-20
        • 2015-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-28
        • 1970-01-01
        • 2017-06-23
        • 1970-01-01
        相关资源
        最近更新 更多