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

时间:2019-12-25 11:31:13

标签: haskell types typeclass

从非正式的角度来说,我创建了一个数据类型Tdict,其中每个实例都是一个对列表,并且每个对都由一个String和一个String列表组成。在其他语言中,我将使用哈希,将字符串映射到字符串列表。由于我正在学习Haskell,所以我想从头开始介绍这种结构,而不是使用Haskell的Hash包。

这是我的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作为参数,并返回一个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作为定义数据类型的参考。

1 个答案:

答案 0 :(得分:4)

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

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

insertTdict :: String -> String -> Tdict -> Tdict