polymorphism - cs.unc.edubbb/comp524/doc/13polymorphism.pdfunc chapel hill brandenburg — spring...
TRANSCRIPT
![Page 1: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/1.jpg)
COMP 524: Programming Language ConceptsBjörn B. Brandenburg
The University of North Carolina at Chapel Hill
Based in part on slides and notes by S. Olivier, A. Block, N. Fisher, F. Hernandez-Campos, and D. Stotts.
Polymorphism
Thursday, April 8, 2010
![Page 2: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/2.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Static Type Checking & RedundancyAssumptions so far.➡Each name is bound to exactly one entity (e.g., a subroutine).➡Static typing: every entity has a specific type.
Suppose we wanted to extract the first element of a 2-tuple.➡Easy in Prolog or Python.‣Dynamic type checking: no type violation at runtime.
➡Hard to do in (basic) Haskell or Java (if it had tuples).‣What is the type of the first element?‣What is the type of the second element?‣What is the type of getFirst?
2Thursday, April 8, 2010
![Page 3: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/3.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Idea: Type VariablesProblem with specific types.➡ Unnecessarily constrained.‣E.g., tuple de-structuring does not depend on type, so why have restrictions?
What if we could write it for “any” type?➡ Analogy: arithmetic with numbers vs. arithmetic with variables.➡ Raises level of abstraction.‣Often called generic programming.
3
getFirst :: (a, b) -> agetFirst (x, y) = x
Thursday, April 8, 2010
![Page 4: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/4.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Idea: Type VariablesProblem with specific types.➡ Unnecessarily constrained.‣E.g., tuple de-structuring does not depend on type, so why have restrictions?
What if we could write it for “any” type?➡ Analogy: arithmetic with numbers vs. arithmetic with variables.➡ Raises level of abstraction.‣Often called generic programming.
4
getFirst :: (a, b) -> agetFirst (x, y) = x
Haskell: lower-case letters are type variables.getFirst is defined for all types a and b without
specific restrictions, i.e. any type.
Thursday, April 8, 2010
![Page 5: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/5.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Parametric PolymorphismParametrized subroutines.➡Defined in terms of one or more type parameters.➡ “Subroutine recipe:” how to define a specific instance of the
family of subroutines given specific types.
Implementation.➡Compiler can generate type-specific versions.‣Or, if possible, code that works with any type (e.g., getFirst).
➡Type checking becomes more complicated.‣ In fact, with certain kinds of polymorphism, type system can be come undecidable (for details see grad school).
Widespread in modern imperative languages.➡Often called generic programming.
5Thursday, April 8, 2010
![Page 6: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/6.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Type ClassesWhat is the type of multiplication?➡Can take any two numbers.‣There are many number types: Int, Float, …
➡But not just any type.‣E.g., addition of tuples not (uniquely) defined.
Idea: type restrictions.➡Multiplication defined for all types such that the
type is a number.
6
> :t (*)(*) :: (Num a) => a -> a -> a
Thursday, April 8, 2010
![Page 7: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/7.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Type ClassesWhat is the type of multiplication?➡Can take any two numbers.‣There are many number types: Int, Float, …
➡But not just any type.‣E.g., addition of tuples not (uniquely) defined.
Idea: type restrictions.➡Multiplication defined for all types such that the
type is a number.
7
> :t (*)(*) :: (Num a) => a -> a -> a
Haskell: if a is a member of the type class Num…
…then… …multiplication is defined as function that
maps 2 as to one a.
Thursday, April 8, 2010
![Page 8: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/8.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Polymorphic Types
Composite types with type variables.➡Some data structures are defined for any type.‣List, Tree, Map, Stack, etc.‣“a X of Y”, e.g., “a List of Int”
➡Generic or parametrized types.➡Heavily used in collection libraries.
8
data Tree a = Nil | Node { left :: Tree a , value :: a , right :: Tree a }
Thursday, April 8, 2010
![Page 9: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/9.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Polymorphic Types
Composite types with type variables.➡Some data structures are defined for any type.‣List, Tree, Map, Stack, etc.‣“a X of Y”, e.g., “a List of Int”
➡Generic or parametrized types.➡Heavily used in collection libraries.
9
data Tree a = Nil | Node { left :: Tree a , value :: a , right :: Tree a }
Type parameter used for components.
Haskell: Tree type is parametrized.
Thursday, April 8, 2010
![Page 10: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/10.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Ad-Hoc Polymorphism / Overloading
What about multiplication in Java?➡Defined for a few specific types.➡Uses same symbol ʻ*ʼ.
Overloading.➡Same name is used for multiple bindings.➡Disambiguated based on types.➡Context-independent: only parameter types used
for disambiguation.➡Context-dependent: parameter types may be
ambiguous if return type is unambiguous.
10Thursday, April 8, 2010
![Page 11: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/11.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Ad-Hoc Polymorphism / Overloading
What about multiplication in Java?➡Defined for a few specific types.➡Uses same symbol ʻ*ʼ.
Overloading.➡Same name is used for multiple bindings.➡Disambiguated based on types.➡Context-independent: only parameter types used
for disambiguation.➡Context-dependent: parameter types may be
ambiguous if return type is unambiguous.
11
Haskell: ad-hoc polymorphism is not supported; polymorphic code is required to use type classes.
Thursday, April 8, 2010
![Page 12: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/12.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Type Classes in HaskellDefinition of a type.➡A set of values.➡A set of operations that can be applied to values of
the types.
Definition of a type class.➡A set of types that for which a number of standard
operations is declared.‣e.g., “every Numeric type must support addition”
➡Haskellʼs way of controlling overloading.‣A function can only be overloaded if it is defined by a type class.
12Thursday, April 8, 2010
![Page 13: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/13.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Type Classes in HaskellDefinition of a type.➡A set of values.➡A set of operations that can be applied to values of
the types.
Definition of a type class.➡A set of types that for which a number of standard
operations is declared.‣e.g., “every Numeric type must support addition”
➡Haskellʼs way of controlling overloading.‣A function can only be overloaded if it is defined by a type class.
13
Common Type Classes
Eq — values can be tested for equality (==, /=)Ord — values are ordered (<, <=, >, >=, max, min)Show — can be converted to string (show)Read — can be parsed from a string (read)Num — a numeric type (+, -, *, negate, abs, signum)Integral — integers (mod, div)Fractional — divisible numbers (/, recip)
Thursday, April 8, 2010
![Page 14: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/14.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Defining a Type Class
14
-- Minimal complete definition: either '==' or '/='.--class Eq a where (==), (/=) :: a -> a -> Bool
x /= y = not (x == y) x == y = not (x /= y)
http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.2.0.0/Prelude.html#t%3AEq
Type Class Definition.➡Specifies a name.➡Required operations (+ types!)➡Default implementations.
Thursday, April 8, 2010
![Page 15: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/15.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Defining a Type Class
15
-- Minimal complete definition: either '==' or '/='.--class Eq a where (==), (/=) :: a -> a -> Bool
x /= y = not (x == y) x == y = not (x /= y)
http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.2.0.0/Prelude.html#t%3AEq
Type Class Definition.➡Specifies a name.➡Required operations (+ types!)➡Default implementations.
Define name.
Thursday, April 8, 2010
![Page 16: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/16.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Defining a Type Class
16
-- Minimal complete definition: either '==' or '/='.--class Eq a where (==), (/=) :: a -> a -> Bool
x /= y = not (x == y) x == y = not (x /= y)
http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.2.0.0/Prelude.html#t%3AEq
Type Class Definition.➡Specifies a name.➡Required operations (+ types!)➡Default implementations.
Required operations and associated types.
Thursday, April 8, 2010
![Page 17: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/17.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Defining a Type Class
17
-- Minimal complete definition: either '==' or '/='.--class Eq a where (==), (/=) :: a -> a -> Bool
x /= y = not (x == y) x == y = not (x /= y)
http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.2.0.0/Prelude.html#t%3AEq
Type Class Definition.➡Specifies a name.➡Required operations (+ types!)➡Default implementations.
Default Implementations:User can specify either function, the missing one uses the default implementation. If user
provides both, then default is overruled.
Thursday, April 8, 2010
![Page 18: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/18.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Declaring a Type Class Instance
18
adding a type to a type classdata Reply = Yes | No | Maybe
repl_equal :: Reply -> Reply -> Boolrepl_equal Yes Yes = Truerepl_equal No No = Truerepl_equal Maybe Maybe = Truerepl_equal _ _ = False
instance Eq Reply where (==) = repl_equal
Define functions + instance.➡Define appropriate functions like any other function.➡Add an instance declaration to overload type class
symbols.
Thursday, April 8, 2010
![Page 19: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/19.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Declaring a Type Class Instance
19
adding a type to a type classdata Reply = Yes | No | Maybe
repl_equal :: Reply -> Reply -> Boolrepl_equal Yes Yes = Truerepl_equal No No = Truerepl_equal Maybe Maybe = Truerepl_equal _ _ = False
instance Eq Reply where (==) = repl_equal
Define functions + instance.➡Define appropriate functions like any other function.➡Add an instance declaration to overload type class
symbols.
Simple Algebraic Type(works for any type)
Thursday, April 8, 2010
![Page 20: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/20.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Declaring a Type Class Instance
20
adding a type to a type classdata Reply = Yes | No | Maybe
repl_equal :: Reply -> Reply -> Boolrepl_equal Yes Yes = Truerepl_equal No No = Truerepl_equal Maybe Maybe = Truerepl_equal _ _ = False
instance Eq Reply where (==) = repl_equal
Define functions + instance.➡Define appropriate functions like any other function.➡Add an instance declaration to overload type class
symbols.
Simple Equality Functioncan be arbitrarily complicated
Thursday, April 8, 2010
![Page 21: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/21.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Declaring a Type Class Instance
21
adding a type to a type classdata Reply = Yes | No | Maybe
repl_equal :: Reply -> Reply -> Boolrepl_equal Yes Yes = Truerepl_equal No No = Truerepl_equal Maybe Maybe = Truerepl_equal _ _ = False
instance Eq Reply where (==) = repl_equal
Define functions + instance.➡Define appropriate functions like any other function.➡Add an instance declaration to overload type class
symbols.
instance declarationadd equations to standard operationsmissing symbols will use default impl.
Thursday, April 8, 2010
![Page 22: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/22.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Deriving Standard Classes
22
compiler-generated instancesRepetition.➡Some type class instances almost always look the same.➡E.g., Eq, Show, Read, …➡Defining such instances over and over is tedious.
Derived instances.➡Built-in support for some special type classes.➡Tell compiler to generate appropriate code.
data Reply = Yes | No | Maybe deriving (Eq)
Thursday, April 8, 2010
![Page 23: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/23.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Type Class Hierarchy
23
Generalizations.➡Some type classes have a hierarchical relationship.➡E.g., an Integral type should also a Num type.➡This can be required in the type class definition.‣Enforced by compiler.
class (Eq a) => Ord a where compare :: a -> a -> Ordering (<), (<=), (>), (>=) :: a -> a -> Bool max, min :: a -> a -> a
Thursday, April 8, 2010
![Page 24: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/24.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Type Class Hierarchy
24
Generalizations.➡Some type classes have a hierarchical relationship.➡E.g., an Integral type should also a Num type.➡This can be required in the type class definition.‣Enforced by compiler.
class (Eq a) => Ord a where compare :: a -> a -> Ordering (<), (<=), (>), (>=) :: a -> a -> Bool max, min :: a -> a -> a
Hierarchy:Every ordered type must also
have a concept of equality.
Thursday, April 8, 2010
![Page 25: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/25.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Polymorphic Instances
25
How to declare instances for polymorphic types?
data Tree a = Nil | Node { val :: a, left :: Tree a, right :: Tree a}
Tree node equality.➡Nil equals nil.➡Node equals node if values are equal and subtrees
are equal.‣What if a is not actually in Eq?
instance (Eq a) => Eq (Tree a) where Nil == Nil = True Node v1 l1 r1 == Node v2 l2 r2 = v1 == v2 && l1 == l2 && r1 == r2 _ == _ = False
Thursday, April 8, 2010
![Page 26: Polymorphism - cs.unc.edubbb/comp524/doc/13Polymorphism.pdfUNC Chapel Hill Brandenburg — Spring 2010 13: Polymorphism COMP 524: Programming Language Concepts Static Type Checking](https://reader034.vdocuments.mx/reader034/viewer/2022042709/5f515878e5f918157102c4c7/html5/thumbnails/26.jpg)
UNC Chapel HillUNC Chapel Hill Brandenburg — Spring 2010
COMP 524: Programming Language Concepts13: Polymorphism
Polymorphic Instances
26
How to declare instances for polymorphic types?
data Tree a = Nil | Node { val :: a, left :: Tree a, right :: Tree a}
Tree node equality.➡Nil equals nil.➡Node equals node if values are equal and subtrees
are equal.‣What if a is not actually in Eq?
instance (Eq a) => Eq (Tree a) where Nil == Nil = True Node v1 l1 r1 == Node v2 l2 r2 = v1 == v2 && l1 == l2 && r1 == r2 _ == _ = False
Polymorphic Instance:Instance only defined for types with
equality; undefined otherwise.
Thursday, April 8, 2010