我声明了具有以下结构的递归数据类型:
data Path = GET | POST | Slash Path String
我真的很想将最后一个值构造函数重命名为/
这样我就可以将它插入可爱的表情中,例如GET /"controller"/"action"
。但是,如果我尝试这样做:
import Prelude hiding ((/))
infixr 5 /
data Path = GET | POST | Path / String
...然后我明白了:
Path.hs:4:30: parse error on input `/'
如果我替换的话,这三行编译得很好/
with :/
或以以下开头的任何其他特殊字符序列:
.
那么,有什么方法可以命名我的值构造函数/
?我知道我可以直接命名它Slash
然后声明一个单独的函数:
(/) :: Path -> String -> Path
(/) = Slash
...但这不会让我进行模式匹配,如下所示:
request :: Path -> String
request path = case path of GET /"hello" -> "Hello!"
GET /"goodbye" -> "Goodbye!"
简短回答:不。
长答案:类型类、类型名称和数据构造函数必须以大写字母或冒号开头(其中一些需要使用语言扩展)。其他所有内容都必须以小写字母或任何其他允许的符号开头。
注意类型变量,通常是小写标识符,遵循相同的规则并且不以冒号开头。
也可以看看GHC 用户指南 http://www.haskell.org/ghc/docs/6.12.2/html/users_guide/data-type-extensions.html#infix-tycons用于启用类型运算符。我认为数据构造函数总是被允许的。
就你个人而言,在你的情况下我只会使用(:/)
。看起来没那么糟糕,过了一段时间你就会习惯忽略冒号。有些人也喜欢尾随冒号,特别是如果数据在某种意义上是“对称的”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)