5. A neat trick for toggling comments
{--}
add x y = x + y
--}
Just delete or insert the }
on the first line to comment or uncomment the add
function.
4. Multi-line strings
They are useful for holding JSON or other content that has quotation marks.
quotes : String
quotes =
"""
{
"quotes": [
{ "content": "A language that doesn't affect the way you think about programming is not worth knowing.", "author": "Alan J. Perlis" },
{ "content": "You don't understand anything until you learn it more than one way.", "author": "Marvin Minsky" }
]
}
"""
3. Field access functions
alan = { name = "Alan Turing", age = 41 }
alonzo = { name = "Alonzo Church", age = 92 }
.name alan == "Alan Turing"
-- > .name
-- <function> : { a | name : String } -> String
.age alonzo == 92
-- > .age
-- <function> : { a | age : Int } -> Int
Notice that .name
and .age
take extensible records as arguments. .name
accepts any record with a name
field and .age
accepts any record with an age
field.
2. Extensible record definitions
type alias Named a =
{ a | name : String }
type alias Positioned a =
{ a | x : Float, y : Float }
alan : Named { age: Int }
alan =
{ name = "Alan Turing"
, age = 41
}
origin : Named (Positioned {})
origin =
{ name = "origin"
, x = 0
, y = 0
}
getName : Named a -> String
getName { name } =
name
getPos : Positioned a -> (Float, Float)
getPos { x, y } =
(x, y)
names : List String
names =
[ getName alan
, getName origin
]
It allows you to write small orthogonal functions that work with a wide variety of records. You get much of the freedom of a dynamically typed language while the type checker keeps you safe.
1. Typeclasses
When Evan released extensible records he made a few interesting remarks:
Polymorphic extensible records give some of the power of first-class modules in OCaml and SML.
...
These records also make it possible to create a more labor intensive version of typeclasses.
...
Part of why I am dragging my feet on adding typeclasses to Elm is because records, first-class modules, and typeclasses do a lot of the same things (records and modules and modules and typeclasses). There have been one or two proposals to unify first-class modules and typeclasses as well. I want to make sure Elm is getting the best of all of these features, so I have been doing a lot of research to make sure I do not make the wrong choices here.
type alias Eq a =
{ eq : a -> a -> Bool
, neq : a -> a -> Bool
}
type alias Comparison a =
{ compare : a -> a -> Order
, lt : a -> a -> Bool
, lte : a -> a -> Bool
, gt : a -> a -> Bool
, gte : a -> a -> Bool
, min : a -> a -> a
, max : a -> a -> a
}
Nikita Volkov has rediscovered this idea and in his write-up he highlights the limitations.
Top comments (0)