Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Syntax rules for Haskell infix datatype constructors

I'm trying to make a Haskell datatype a bit like a python dictionary, a ruby hash or a javascript object, in which a string is linked to a value, like so:

data Entry t = Entry String t
type Dictionary t = [Entry t]

The above code works fine. However, I would like a slightly nicer constructor, so I tried defining it like this:

data Entry t = String ~> t

This failed. I tried this:

data Entry t = [Char] ~> t

Again, it failed. I know that ~ has special meaning in Haskell, and GHCi still permits the operator ~>, but I still tried one other way:

data Entry t = [Char] & t

And yet another failure due to parse error. I find this confusing because, for some inexplicable reason, this works:

data Entry t = String :> t

Does this mean that there are certain rules for what characters may occur in infix type constructors, or is it a cast of misinterpretation. I'm not a newbie in Haskell, and I'm aware that it would be more idiomatic to use the first constructor, but this one's stumping me, and it seems to be an important part of Haskell that I'm missing.

like image 393
AJF Avatar asked Nov 18 '14 17:11

AJF


People also ask

What is a constructor in Haskell?

Data constructors are first class values in Haskell and actually have a type. For instance, the type of the Left constructor of the Either data type is: Left :: a -> Either a b. As first class values, they may be passed to functions, held in a list, be data elements of other algebraic data types and so forth.

How types are declared in Haskell?

Haskell has three basic ways to declare a new type: The data declaration, which defines new data types. The type declaration for type synonyms, that is, alternative names for existing types. The newtype declaration, which defines new data types equivalent to existing ones.

Which of the following character is the infix operator that adds its first argument to the front of its second argument in a list in the Haskell language?

The list [1,2,3] in Haskell is actually shorthand for the list 1:(2:(3:[])), where [] is the empty list and : is the infix operator that adds its first argument to the front of its second argument (a list). (: and [] are like Lisp's cons and nil, respectively.)

What is nil Haskell?

The Nil constructor is an empty list. It contains no objects. So any time you're using the [] expression, you're actually using Nil . Then the second constructor concatenates a single element with another list. The type of the element and the list must match up obviously.


1 Answers

Any operator that starts with a colon : is a type constructor or a data constructor, with the exception of (->). If you want the tilde, you could use :~>, but you're not going to get away with using something that doesn't start with a colon. Source

like image 93
bheklilr Avatar answered Oct 07 '22 06:10

bheklilr