mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-12-23 17:41:41 +00:00
fixed line lengths
This commit is contained in:
parent
f276866777
commit
35fc26b754
@ -330,15 +330,19 @@ distance (Point x y) (Point x' y') = sqrt $ dx + dy
|
|||||||
|
|
||||||
-- Types can have multiple data constructors with arguments, too
|
-- Types can have multiple data constructors with arguments, too
|
||||||
|
|
||||||
data Name = Mononym String | FirstLastName String String | FullName String String String
|
data Name = Mononym String
|
||||||
|
| FirstLastName String String
|
||||||
|
| FullName String String String
|
||||||
|
|
||||||
-- To make things clearer we can use record syntax
|
-- To make things clearer we can use record syntax
|
||||||
|
|
||||||
data Point2D = CartesianPoint2D { x :: Float, y :: Float } | PolarPoint2D { r :: Float, theta :: Float }
|
data Point2D = CartesianPoint2D { x :: Float, y :: Float }
|
||||||
|
| PolarPoint2D { r :: Float, theta :: Float }
|
||||||
|
|
||||||
myPoint = CartesianPoint2D { x = 7.0, y = 10.0 }
|
myPoint = CartesianPoint2D { x = 7.0, y = 10.0 }
|
||||||
|
|
||||||
-- Using record syntax automatically creates accessor functions (the name of the field)
|
-- Using record syntax automatically creates accessor functions
|
||||||
|
-- (the name of the field)
|
||||||
|
|
||||||
xOfMyPoint = x myPoint
|
xOfMyPoint = x myPoint
|
||||||
|
|
||||||
@ -357,8 +361,9 @@ myPoint'2 = CartesianPoint2D 3.3 4.0
|
|||||||
|
|
||||||
-- It's also useful to pattern match data constructors in `case` expressions
|
-- It's also useful to pattern match data constructors in `case` expressions
|
||||||
|
|
||||||
distanceFromOrigin x = case x of (CartesianPoint2D x y) -> sqrt $ x ** 2 + y ** 2
|
distanceFromOrigin x =
|
||||||
(PolarPoint2D r _) -> r
|
case x of (CartesianPoint2D x y) -> sqrt $ x ** 2 + y ** 2
|
||||||
|
(PolarPoint2D r _) -> r
|
||||||
|
|
||||||
-- Your data types can have type parameters too:
|
-- Your data types can have type parameters too:
|
||||||
|
|
||||||
@ -386,8 +391,9 @@ somePerson :: Person
|
|||||||
someCircle :: Circle
|
someCircle :: Circle
|
||||||
distance :: Point -> Point -> Float
|
distance :: Point -> Point -> Float
|
||||||
|
|
||||||
-- The following would compile and run without issue, even though it does not make
|
-- The following would compile and run without issue,
|
||||||
-- sense semantically, because the type synonyms reduce to the same base types
|
-- even though it does not make sense semantically,
|
||||||
|
-- because the type synonyms reduce to the same base types
|
||||||
|
|
||||||
distance (getMyHeightAndWeight somePerson) (findCenter someCircle)
|
distance (getMyHeightAndWeight somePerson) (findCenter someCircle)
|
||||||
|
|
||||||
@ -397,10 +403,11 @@ distance (getMyHeightAndWeight somePerson) (findCenter someCircle)
|
|||||||
|
|
||||||
-- Typeclasses are one way Haskell does polymorphism
|
-- Typeclasses are one way Haskell does polymorphism
|
||||||
-- They are similar to interfaces in other languages
|
-- They are similar to interfaces in other languages
|
||||||
-- A typeclass defines a set of functions that must work on any type that is in
|
-- A typeclass defines a set of functions that must
|
||||||
-- that typeclass.
|
-- work on any type that is in that typeclass.
|
||||||
|
|
||||||
-- The Eq typeclass is for types whose instances can be tested for equality with one another
|
-- The Eq typeclass is for types whose instances can
|
||||||
|
-- be tested for equality with one another.
|
||||||
|
|
||||||
class Eq a where
|
class Eq a where
|
||||||
(==) :: a -> a -> Bool
|
(==) :: a -> a -> Bool
|
||||||
@ -428,27 +435,30 @@ canProceedThrough t = t /= Red
|
|||||||
|
|
||||||
-- You can NOT create an instance definition for a type synonym
|
-- You can NOT create an instance definition for a type synonym
|
||||||
|
|
||||||
-- Functions can be written to take typeclasses with type parameters, rather than types,
|
-- Functions can be written to take typeclasses with type parameters,
|
||||||
-- assuming that the function only relies on features of the typeclass
|
-- rather than types, assuming that the function only relies on
|
||||||
|
-- features of the typeclass
|
||||||
|
|
||||||
isEqual (Eq a) => a -> a -> Bool
|
isEqual (Eq a) => a -> a -> Bool
|
||||||
isEqual x y = x == y
|
isEqual x y = x == y
|
||||||
|
|
||||||
-- Note that x and y MUST be the same type, as they are both defined as being of type parameter 'a'
|
-- Note that x and y MUST be the same type, as they are both defined
|
||||||
-- A typeclass does state that different types in the typeclass can be mixed together
|
-- as being of type parameter 'a'.
|
||||||
-- So `isEqual Red 2` is invalid, even though 2 is an Int which is an instance of Eq, and Red is
|
-- A typeclass does not state that different types in the typeclass can
|
||||||
-- a TrafficLight which is also an instance of Eq
|
-- be mixed together.
|
||||||
|
-- So `isEqual Red 2` is invalid, even though 2 is an Int which is an
|
||||||
|
-- instance of Eq, and Red is a TrafficLight which is also an instance of Eq
|
||||||
|
|
||||||
-- Other common typeclasses are:
|
-- Other common typeclasses are:
|
||||||
-- Ord for types that can be ordered, allowing you to use >, <=, etc.
|
-- Ord for types that can be ordered, allowing you to use >, <=, etc.
|
||||||
-- Read for types that can be created from a string representation
|
-- Read for types that can be created from a string representation
|
||||||
-- Show for types that can be converted to a string for display
|
-- Show for types that can be converted to a string for display
|
||||||
-- Num, Real, Integral, Fractional for types that can do mathematical calculation
|
-- Num, Real, Integral, Fractional for types that can do math
|
||||||
-- Enum for types that can be stepped through
|
-- Enum for types that can be stepped through
|
||||||
-- Bounded for types with a maximum and minimum
|
-- Bounded for types with a maximum and minimum
|
||||||
|
|
||||||
-- Haskell can automatically make types part of Eq, Ord, Read, Show, Enum, and Bounded
|
-- Haskell can automatically make types part of Eq, Ord, Read, Show, Enum,
|
||||||
-- with the `deriving` keyword at the end of the type declaration
|
-- and Bounded with the `deriving` keyword at the end of the type declaration
|
||||||
|
|
||||||
data Point = Point Float Float deriving (Eq, Read, Show)
|
data Point = Point Float Float deriving (Eq, Read, Show)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user