A phantom type is a parametrised type
whose parameters do not all appear on the right-hand side of its definition.
For
example,
data Employee a = Employee EmpId
FirstName LastName
In above statement, the type variable
‘a’ is not used in data contructor.
What
is the advantage of phantom type?
Let us assume, you are maintaining
database of companies ABC, XYZ. Due to some organizational changes, Compnay ABC
want to change their employee ids, but not XYZ. Following sample application
achieve the same using phantom types.
Sample.hs
type FirstName = String type LastName = String type EmpId = Integer data ABC data XYZ type EmpABC = Employee ABC type EmpXYZ = Employee XYZ data Employee a = Employee EmpId FirstName LastName updateEmployeeIdForABC :: EmpABC -> EmpId-> EmpABC updateEmployeeIdForABC (Employee empId firstName lastName) empId1 = Employee empId1 firstName lastName getEmployeeABC :: EmpId -> FirstName -> LastName -> EmpABC getEmployeeABC empId firstName lastName = Employee empId firstName lastName getEmployeeXYZ:: EmpId -> FirstName -> LastName -> EmpXYZ getEmployeeXYZ empId firstName lastName = Employee empId firstName lastName
Prelude> :load Sample.hs [1 of 1] Compiling Main ( Sample.hs, interpreted ) Ok, modules loaded: Main. *Main> *Main> let emp1 = getEmployeeABC 1 "Hari" "Krishna" *Main> let emp2 = getEmployeeXYZ 123 "Anand" "Bandaru" *Main> *Main> :t emp1 emp1 :: EmpABC *Main> *Main> :t emp2 emp2 :: EmpXYZ *Main> *Main> updateEmployeeIdForABC emp1 34 Employee 34 "Hari" "Krishna" *Main> *Main> updateEmployeeIdForABC emp2 345 <interactive>:13:24: Couldn't match type ‘XYZ’ with ‘ABC’ Expected type: EmpABC Actual type: EmpXYZ In the first argument of ‘updateEmployeeIdForABC’, namely ‘emp2’ In the expression: updateEmployeeIdForABC emp2 345
No comments:
Post a Comment