我可以有一个名为“/”的值构造函数吗?

2024-02-20

我声明了具有以下结构的递归数据类型:

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(使用前将#替换为@)

我可以有一个名为“/”的值构造函数吗? 的相关文章

随机推荐