Idiomatic way for unique data constructors naming

Viewed 79

Can I use the same name (name here) in different data types?

data Person
   = Person
   {
       name   :: String,
       salary :: Int
   }
   deriving( Show )

data University
   = University
   {
--     nameu    :: String, <--- this works fine
       name     :: String,
       students :: [ Person ]
   }
   deriving( Show )

main = putStrLn $ show $ University {
    name = "TAU",
    students = [
        Person { name = "Oren",  salary = 740 },
        Person { name = "Moish", salary = 920 },
        Person { name = "Axel",  salary = 612 }
    ]
}

When I try to do it, I get this error:

[1 of 1] Compiling Main             ( Main.hs, Main.o )

Main.hs:13:8: error:
    Multiple declarations of ‘name’
    Declared at: Main.hs:4:8
                 Main.hs:13:8
   |
13 |        name     :: String,
   |        ^^^^
1 Answers
module Person (Person(..)) where
data Person
   = Person
   {
       name   :: String,
       salary :: Int
   }
   deriving( Show )

And University module is similar:

module University (University(..)) where
import Person
data University
   = University
   {
       name     :: String,
       students :: [ Person ]
   }
   deriving( Show )

Now Main simply imports both modules

import Person
import University

main = putStrLn $ show $ University {
    University.name = "TAU",
    students = [
        Person { Person.name = "Oren",  salary = 740 },
        Person { Person.name = "Moish", salary = 920 },
        Person { Person.name = "Axel",  salary = 612 }
    ]
}

Everything compiles fine:

$ ghc Main.hs
[1 of 3] Compiling Person           ( Person.hs, Person.o )
[2 of 3] Compiling University       ( University.hs, University.o )
[3 of 3] Compiling Main             ( Main.hs, Main.o )
Linking Main ...

and runs:

$ ./Main | sed "s/Person/\nPerson/g"
University {name = "TAU", students = [
Person {name = "Oren", salary = 740},
Person {name = "Moish", salary = 920},
Person {name = "Axel", salary = 612}]}
Related