假设我想定义一个带有int和字符串的新类型。我知道这样定义:
data Comp = Comp Int String
但这种表示法的问题是,当我有这种类型的实例时,实例的形式为:
Comp 45 "heloWorld"
我不希望这样,我想要数据类型的这些“参数”(更像是记录的条目),我希望它们以字符分隔,例如|或#而不是空格。我不希望那个角色做任何事情,这只是我想要使用的符号。在这种情况下,
45#"hii"
是我想要的而不是
45 "hii"
。
为了做到这一点,我如何调整数据类型的定义?
我打算为此数据类型重载运算符,例如:
45#"kkk" + 128#"a"
应该是有效的操作。
答案 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的建议的一个小优点是,自动派生的Read
和Show
实例将使用:#
表示法,您可以使用匹配使用它:
thingy (n :# s) = ...
那就是说,它只是一个符合标准的便利,@ fjh的建议也很好并且常用。