haskell - 关于给出错误的抽象数据类型的方程式(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 中,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
不是一个类型,但你正试图像使用类型一样使用它。
推荐阅读
- python - 带有 eventlet 的 Flask-SocketIO:Web 和 Websockets 线程
- python - Groupby 并根据 Pandas 中的另一列对一列进行降序排列
- auth0 - 赛普拉斯无法使用新的 auth0-spa-js 包请求 API 或显示内容
- macros - 如何在 sbcl common lisp 的 let 绑定中定义(defmacro)宏?
- c - 如何在没有 GPU 的情况下在 Arm 上加速 Gtk2+ 的 Cairo 绘画速度
- windows - 如何在 .bat 文件的“for”命令中格式化 Tesseract-OCR 语言设置
- java - 如何通过摆脱冗余来优化下面的代码?
- twitter-bootstrap - 导航切换向下滚动超过该部分的开头
- eclipse - 将 ISO20022 E-Repository 导入 Eclipse 的问题
- ruby - 为什么有人会将 ruby-saml gem 请求/响应的证书签名设置为 false?