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

问题描述 投票:1回答:1

非正式地说,我创建了一个数据类型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作为定义数据类型的参考。

haskell types typeclass
1个回答
4
投票

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

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

insertTdict :: String -> String -> Tdict -> Tdict
© www.soinside.com 2019 - 2024. All rights reserved.