创建包含列表的数据类型并在其上定义函数
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
(参数 v
和 d
的错误消息相同)。
我做错了什么?我有一种感觉,我在 Haskell.
中遗漏了一些基本的东西
我使用 this page 作为定义数据类型的参考。
您的类型 不是 类型类。因此,像 (String k, String v, Tdict d) =>
这样的类型约束没有意义。
您可以通过以下方式实现该功能:
insertTdict :: <b>String</b> -> <b>String</b> -> <b>Tdict</b> -> Tdict
通俗地说,我创建了一个数据类型 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
(参数 v
和 d
的错误消息相同)。
我做错了什么?我有一种感觉,我在 Haskell.
中遗漏了一些基本的东西我使用 this page 作为定义数据类型的参考。
您的类型 不是 类型类。因此,像 (String k, String v, Tdict d) =>
这样的类型约束没有意义。
您可以通过以下方式实现该功能:
insertTdict :: <b>String</b> -> <b>String</b> -> <b>Tdict</b> -> Tdict