开发者

Can I have a value constructor named "/""?

开发者 https://www.devze.com 2023-01-28 14:25 出处:网络
I\'ve declared a recursive data type with the following structure: data Path = GET | POST | Slash Path String

I've declared a recursive data type with the following structure:

data Path = GET | POST | Slash Path String

I'd really like to rename that last value constructor to / so that I can infix it in cute expressions like GET /"controller"/"action". However, if I try to do so:

import Prelude hiding ((/))
infixr 5 /
data Path = GET | POST | Path / String

...then I get this:

Path.hs:4:30: parse error on input `/'

Those same three lines compile just fine if I replace / with :/ or any other special character sequence beginning with :.

So, is there any way I can name my value constructor /? I know that I can just name it Slash and then declare a separate function:

(/) :: Path -> String -> Path 
(/) = Slash

...but that won't let me pattern match, as in:

request :: Path -> String
r开发者_C百科equest path = case path of GET /"hello" -> "Hello!"
                            GET /"goodbye" -> "Goodbye!"


Short answer: No.

Long answer: Type classes, type names, and data constructors must begin with either a capital letter or a colon (some of this requires using a language extension). Everything else must begin with a lowercase letter or any other allowed symbol.

Note that type variables, which are normally lowercase identifiers, follow the same rules and do not begin with a colon.

See also the GHC user's guide for enabling type operators. Data constructors are always allowed, I think.

Personally, in your case I'd just use (:/). It doesn't look that bad, and after a while you get used to ignoring the colons. Some people like a trailing colon as well, especially if the data is "symmetric" in some sense.


No, you can't do this. In pure Haskell 98, user-defined type names and constructors must be alphanumeric and begin with an uppercase letter; this is in section 4.1.2 of the Haskell 98 Report. In GHC, just as user-defined constructors with alphanumeric names must begin with an uppercase letter, user-defined constructors which are operators must begin with a :.1 (The same is true for user-defined type names.) This is documented in section 7.4.2 of the GHC manual. I'd probably use :/, myself, with or without / as a synonym.


1: The reason for the "user-defined" qualification is that there are a few built-in exceptions: ->, [], (), and the tuple types (,), (,,), etc. as type names; and () and the tuple type constructors (,), (,,), etc., as type constructors


I think all constructor operators need to start with a colon, (but I may be wrong).

So you could do:

data Path = GET | POST | Path :/ String
0

精彩评论

暂无评论...
验证码 换一张
取 消