在Haskell中定义由已知类型组成的新类型

时间:2014-05-20 20:13:05

标签: haskell types overloading

假设我想定义一个带有int和字符串的新类型。我知道这样定义:

data Comp = Comp Int String

但这种表示法的问题是,当我有这种类型的实例时,实例的形式为:

Comp 45 "heloWorld"

我不希望这样,我想要数据类型的这些“参数”(更像是记录的条目),我希望它们以字符分隔,例如|或#而不是空格。我不希望那个角色做任何事情,这只是我想要使用的符号。在这种情况下, 45#"hii" 是我想要的而不是 45 "hii"。 为了做到这一点,我如何调整数据类型的定义? 我打算为此数据类型重载运算符,例如: 45#"kkk" + 128#"a"应该是有效的操作。

2 个答案:

答案 0 :(得分:6)

您可以将运算符定义为构造函数的别名:

data Comp = Comp Int String deriving Show

(#) :: Int -> String -> Comp
(#) = Comp

现在您可以使用#来构建您的值:

λ: 45#"kkk"
Comp 45 "kkk"

答案 1 :(得分:4)

您可以定义中缀数据构造函数,但它们必须以:开头。所以:

data Comp = Int :# String

如果您打算使用符号45:#"kkk" + 128:#"a",则还应将其定义为具有严格的优先级:

infix 9 :#

使用中缀构造函数而不是@ fjh的建议的一个小优点是,自动派生的ReadShow实例将使用:#表示法,您可以使用匹配使用它:

thingy (n :# s) = ...

那就是说,它只是一个符合标准的便利,@ fjh的建议也很好并且常用。