首页 > 解决方案 > 关于给出错误的抽象数据类型的方程式(haskell)

问题描述

试图从我在 Haskell 中创建的称为 Map 的抽象数据类型中删除一个元素,我正在使用相等性来查看匹配的键以从 Map 中删除该元素

data Map k v = Map {pairs::[(k, v)]}  deriving (Show)

removeElement :: Eq k -> Map k v -> Map k v
removeElement key (Map pairs) = Map [x |x <- pairs,not(fst x == key)]

给我错误:

main.hs:33:18: error:
    * Expected a type, but `Eq k' has kind `Constraint'
    * In the type signature:
        removeElement :: Eq k -> Map k v -> Map k v
   |
33 | removeElement :: Eq k -> Map k v -> Map k v
   |                  ^^^^
<interactive>:3:1: error:
    * Variable not in scope: main
    * Perhaps you meant `min' (imported from Prelude)

根据我的理解,一旦建立了 Eq k,我就不必去其他任何地方,我也无法真正理解编译器试图告诉我的内容,希望能得到帮助。

标签: haskell

解决方案


在 Haskell 中,Eq不是类型而是类型类。对于类型类,您应该使用=>而不是->.

您还需要添加 ak来代表您正在调用的参数key

removeElement :: Eq k => k -> Map k v -> Map k v
removeElement key (Map pairs) = Map [x |x <- pairs,not(fst x == key)]

请注意,没有对应于 的参数Eq k

编译器消息“期望一个类型,但 'Eq k' 有一种 'Constraint'”,基本上是在说这Eq k不是一个类型,但你正试图像使用类型一样使用它。


推荐阅读