首页 > 解决方案 > 将数据构造函数字段注册到类

问题描述

这些是我的声明:

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 QResultand Couldn't match type CSV with QResult

标签: haskell

解决方案


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

上下文总是足以确定是否需要类型构造函数或数据构造函数,这就是为什么您可以重用每个名称的原因。


类型构造函数TableCSV应该使用type关键字定义

type CSV = String
type Table = [[String]]

推荐阅读