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

jsm*_*mrt 0 haskell types overloading

假设我想定义一个带有int和string的新类型.我知道要这样定义:

data Comp = Comp Int String

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

Comp 45 "heloWorld"

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

fjh*_*fjh 6

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

data Comp = Comp Int String deriving Show

(#) :: Int -> String -> Comp
(#) = Comp
Run Code Online (Sandbox Code Playgroud)

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

?: 45#"kkk"
Comp 45 "kkk"
Run Code Online (Sandbox Code Playgroud)

  • 额外注意:如果你真的想要,你可以定义一个[中缀构造函数](http://www.haskell.org/ghc/docs/7.8.2/html/users_guide/data-type-extensions.html#infix-tycons)一,虽然名称必须以`:`开头. (2认同)
  • @Rhymoid你的意思是'MagicHash`.如果你之间有空格,它仍然可以工作:`45#"kkk"` (2认同)
  • @ gonza1207,`|`(本身)不是有效的运算符,因为它由guard语法使用.你不能拥有任何你想要的运营商,有一些规则......(但你可以拥有比大多数语言更多的运营商!) (2认同)