从非正式的角度来说,我创建了一个数据类型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
(参数v
和d
的错误消息是相同的。)
我做错了什么?我有一种感觉,就是我缺少Haskell的一些基本知识。
我使用this page作为定义数据类型的参考。
答案 0 :(得分:4)
您的类型不是 类型类。因此,(String k, String v, Tdict d) =>
这样的类型约束就没有意义。
您可以通过以下方式实现该功能:
insertTdict :: String -> String -> Tdict -> Tdict