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]]