创建包含列表的数据类型并在其上定义函数

Creating data types containing lists and defining functions on them

通俗地说,我创建了一个数据类型 Tdict,其中它的每个实例都是一个对列表,每个对由一个字符串和一个字符串列表组成;在其他语言中,我会使用哈希,将字符串映射到字符串列表。由于我正在学习Haskell,我想从头开始推出这个结构,而不是使用Haskell 的哈希包。

这是我对Tdict的数据类型定义,使用了两个辅助类型定义:

-- Pair of two strings
data TPair = TPair String String deriving (Show)

-- Associating one String to a list of Strings
data Tassoc = Tassoc String [String] deriving (Show)

-- type synonym for list of associations
type Tdict = [Tassoc]

到目前为止,这被 Haskell 接受,所以至少它在语法上是正确的。现在我想定义一个函数,它将两个字符串和一个 Tdict 作为参数,returns 一个 Tdict。但是,Haskell 已经拒绝了函数的签名定义:

insertTdict :: (String k, String v, Tdict d) => k -> v -> d -> Tdict

错误消息是关于参数 v 和 `d 的,内容是:

error:
    • Expected kind ‘* -> Constraint’, but ‘Tdict’ has kind ‘*’
    • In the type signature:
        insertTdict :: (String k, String v, Tdict d) =>
                   k -> v -> d -> Tdict

(参数 vd 的错误消息相同)。

我做错了什么?我有一种感觉,我在 Haskell.

中遗漏了一些基本的东西

我使用 this page 作为定义数据类型的参考。

您的类型 不是 类型类。因此,像 (String k, String v, Tdict d) => 这样的类型约束没有意义。

您可以通过以下方式实现该功能:

insertTdict :: <b>String</b> -> <b>String</b> -> <b>Tdict</b> -> Tdict