Haskell 将数据构造函数字段注册到类

Haskell 将数据构造函数字段注册到类,haskell,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

以下是我的声明:

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中注册查询时,最后3行是给我一个错误的代码。如果我使用
QResult
我得到的
数据构造函数不在范围内
,如果我不使用
QResult
我得到的
无法将类型表与QResult
匹配,
无法将类型CSV与QResult
匹配

QResult
是类型构造函数,而不是数据构造函数。您需要使用它的一个数据构造函数来创建
eval
的返回值

instance Eval Query where
    eval (FromCSV csv) = Table (read_csv csv)
    eval (ToCSV table) = CSV (write_csv table)

您的
查询
类型没有多大意义。每个查询都只是一个
FromCSV
值,包装在零个或多个
ToCSV
层中。每个
查询
都可以简单地简化为一个
CSV
值。@chepner
查询
类型要大得多,我只是写了这两个值,因为我刚刚开始,我想知道为什么它会给我一个错误。
QResult
不是数据构造函数;它是一个类型构造函数。您不能将其应用于
write\u csv
read\u csv
的返回值。您必须根据需要使用
CSV
Table
List
。@chepner这两个函数都返回一个表或CSV,但即使我删除
QResult
,它仍然会给我一个错误。
type CSV = String
type Table = [[String]]