Characters and Strings form the basis for text representation in Elm.
Strings can be thought of as lists of characters and most List functions have their equivalent in the String module.
The Char type represents a single unicode character with single quotes e.g. 'a'.
The Char module provides predicate functions (Char -> Bool) to test qualities of a character: isUpper, isLower, isAlpha, and isAlphaNum.
The module also provides functions to convert a character toUpper, toLower, toLocaleUpper, toLocaleLower, as well as to/from their numerical unicode value (Int) with toCode and fromCode.
The String type provides a built-in representation for efficient string manipulation and can represent any sequence of unicode characters.
Strings are represented with double quotes: "this is a string".
Multi-line strings are represented with triple double quotes and can have unescaped quotes and newlines.
haiku =
"""
Code's strings entwine
, In binary, thoughts combine
, Logic's elegant line.
"""
reverse : String -> String reverses the string.
reverse "Hello world."
--> ".dlrow olleH"
repeat : Int -> String -> String repeats a string n times.
repeat 2 "Hello world."
--> "Hello world.Hello world."
replace : String -> String -> String -> String replaces all occurrences of a given substring.
replace "Hello" "Goodbye cruel" "Hello world."
--> "Goodbye cruel world."
append : String -> String -> String appends two strings.
The ++ operator can also be used to do this.
append "butter" "fly"
--> "butterfly"
"butter" ++ "fly"
--> "butterfly"
concat : List String -> String concatenates a list of strings into a single string.
concat ["never", "the", "less"]
--> "nevertheless"
split : String -> String -> List String splits a string into a list of strings at the given separator.
split ";" "cat;dog;cow"
--> ["cat", "dog", "cow"]
join : String -> List String -> String concatenates a list of strings together with a given separator.
join "a" ["H", "w", "ii", "n"]
--> "Hawaiian"
words : String -> List String breaks a string into strings, splitting on chunks of whitespace.
words "How are \t you? \n Good?"
--> ["How", "are", "you?", "Good?"]
lines : String -> List String breaks a string into lines, splitting on newlines.
lines "How are you?\nGood?"
--> ["How are you?", "Good?"]
cons : Char -> String -> String adds a character to the beginning of a string.
cons 'T' "he truth is out there"
--> "The truth is out there"
uncons : String -> Maybe ( Char, String ) splits a non-empty string into its head and tail.
This lets you pattern match on strings exactly as you would with lists.
Empty strings return Nothing.
uncons "abc"
--> Just ('a', "bc")
uncons ""
--> Nothing
slice : Int -> Int -> String -> String takes a substring given a start and end index.
Negative indexes are taken starting from the end of the list.
slice 0 6 "snakes on a plane!"
--> "snakes"
slice 0 -7 "snakes on a plane!"
--> "snakes on a"
left : Int -> String -> String and right : Int -> String -> String take n characters from the left or right side of the string respectively.
left 2 "Mulder"
--> "Mu"
right 2 "Scully"
--> "ly"
dropLeft : Int -> String -> String and dropRight : Int -> String -> String drop n characters from the left or right side of a string respectively.
dropRight 6 "Hello world."
--> "Hello"
dropLeft 6 "Hello world."
--> "world"
length : String -> Int returns the number of characters in a string.
length "Hello world."
--> 12
isEmpty : String -> Bool determines if a string is empty.
isEmpty "Hello world."
--> False
contains : String -> String -> Bool checks if the second string contains the first one.
contains "the" "theory"
--> True
contains "THE" "theory"
--> False
startsWith : String -> String -> Bool and endsWith : String -> String -> Bool check if the second string starts/ends with a given substring.
startsWith "the" "theory"
--> True
endsWith "ory" "theory"
--> True
indexes : String -> String -> List Int gets a list of all the starting indexes of a substring in another string.
indexes "ss" "Mississippi"
--> [2, 5]
toInt : String -> Maybe Int tries to convert a string into Just Int, and returns Nothing for improperly formatted strings.
toInt "-42"
--> Just -42
toInt "3.1"
--> Nothing
toInt "two"
--> Nothing
fromInt : Int -> String converts an integer to a string.
fromInt -42
--> "-42"
toFloat : String -> Maybe Float tries to convert a string into a float, failing on improperly formatted strings.
toFloat "-42"
--> Just -42.0
toFloat "3.1"
--> Just 3.1
toFloat "two"
--> Nothing
fromFloat : Float -> String converts a float to a string.
fromFloat 3.9
--> "3.9"
toList : String -> List Char and fromList : List Char -> String convert a string to and from a list of characters respectively.
toList "abc"
--> ['a', 'b', 'c']
fromList ['a', 'b', 'c']
--> "abc"
fromChar : Char -> String converts a character to a string.
fromChar 'a'
--> "a"
toUpper : String -> String and toLower : String -> String convert strings to all upper or all lower case respectively.
Useful for case-insensitive comparisons.
toUpper "skinner"
--> "SKINNER"
toLower "X-FILES"
--> "x-files"
pad : Int -> Char -> String -> String pads a string on both sides with the provided Char until it has the given length.
pad 5 ' ' "11"
--> " 11 "
Similarly, padLeft and padRight pad a string on either side until it has a given length.
trim : String -> String removes whitespace on both sides of a string.
trim " hats \n"
--> "hats"
trimLeft and trimRight remove whitespace on either side of a string.
map : (Char -> Char) -> String -> String transforms every character in a string with the given function.
Note the function provided must be a mapping from and to Char.
map (\c -> if c == '/' then '.' else c) "a/b/c"
--> "a.b.c"
filter : (Char -> Bool) -> String -> String keeps only the characters that pass the test.
filter isDigit "R2-D2"
--> "22"
foldl : (Char -> b -> b) -> b -> String -> b reduces a string starting from the left.
The function is applied with the first character as its first parameter and an initial value provided as its second parameter.
The result of the function must be of the same type as the as the initial value provided and is applied to each character in sequence.
foldl (\c acc -> Char.toCode c + acc) 0 "the sum of my unicode is "
--> 2260
foldr does the same but starting from the right side of the string.
any : (Char -> Bool) -> String -> Bool determines whether any character returns True to the predicate provided.
any isDigit "R2-D2"
--> True
any isDigit "heart"
--> False
all : (Char -> Bool) -> String -> Bool determines if all characters in a string return True to the predicate provided.
all isDigit "R2-D2"
--> False
all isAlpha "heart"
--> True