While reading some Haskell code snippets I found something that seemed confusing. The snippet involved newtype
and record syntax. A simplified example is the following:
newtype PersonName = PersonName { theName :: String }
...
let p1 = PersonName $ getName obj
in print $ theName
I was not able to find a place where the PersonName
was created by specifying the value of theName
explicitly for example (Person { theName = "xyz" }
) . The reason is that record syntax allows an alternative way of specifying the field values. For example:
let p1 = PersonName "Luis" -- valid!
...
let p2 = PersonName { theName = "Luis" } -- valid!
Another thing that I found interesting is the newtype
restrictions. For example it only allows you to specify one field in our record:
newtype PersonName' = PersonName' { firstName :: String, lastName ::String }
Compiling this is going to generate the following error:
newtypeexp.hs:6:23: error:
• The constructor of a newtype must have exactly one field
but ‘PersonName'’ has two
• In the definition of data constructor ‘PersonName'’
In the newtype declaration for ‘PersonName'’
|
6 | newtype PersonName' = PersonName' { firstName :: String, lastName ::String }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This seems to be related to the fact that newtype
is used as a compile-type concept only. More info here https://wiki.haskell.org/Newtype#The_short_version .