haskell - 将数据构造函数字段注册到类
问题描述
这些是我的声明:
data CSV = String
data Table = [[String]]
write_csv :: Table -> CSV
read_csv :: CSV -> Table
data QResult = CSV CSV | Table Table | List [String]
data Query = FromCSV CSV | ToCSV Query
class Eval a where
eval :: a -> QResult
instance Eval Query where
eval (FromCSV csv) = QResult (read_csv csv)
eval (ToCSV table) = QResult (write_csv table)
这是我的代码,当我尝试在 Eval 中注册 Query 时,最后 3 行是给我一个错误的代码。如果我使用,QResult
我得到Data constructor not in scope
,如果我不使用它,QResult
我得到Couldn't match type Table with QResult
and Couldn't match type CSV with QResult
。
解决方案
QResult
是类型构造函数,而不是数据构造函数。您需要使用其数据构造函数之一来创建eval
.
instance Eval Query where
eval (FromCSV csv) = Table (read_csv csv)
eval (ToCSV table) = CSV (write_csv table)
Table :: Table -> QResult
是您可以应用于 的返回值的数据构造函数read_csv
。
CSV :: CSV -> QResult
是您可以应用于 的返回值的数据构造函数write_csv
。
上下文总是足以确定是否需要类型构造函数或数据构造函数,这就是为什么您可以重用每个名称的原因。
类型构造函数Table
和CSV
应该使用type
关键字定义
type CSV = String
type Table = [[String]]
推荐阅读
- flutter - 从 firebase 获取视频
- c# - DisplayName对于模型子集合
- json - 使用 jq 在类似文件夹的 JSON 结构中提取完整路径
- python - 带有硒的python twitter bot
- elasticsearch - 如何查询从无痛 script_fields 返回的字段
- python - 不断在文本文件中搜索以查看是否存在预先识别的字符串
- visual-studio - 将DLL项目添加到解决方案VS2019
- unit-testing - 如何在 Loopback 4 的验收测试中模拟服务
- google-apps-script - Google 日历活动在错误的日期和时间创建
- php - 创建目录并将多个文件上传到创建的目录PHP