Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФП_ЛР №1-2.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
948.22 Кб
Скачать

Условные выражения

В определении функции в языке Haskell можно использовать условные выражения. Запишем функцию signum, вычисляющую знак переданного ей аргумента:

Условное выражение записывается в виде:

if условие then выражение else выражение.

Обратите внимание, что хотя по виду это выражение напоминает соответствующий оператор в языке Си или Паскаль, в условном выражении языка Haskell должны присутствовать и then-часть и else-часть. Выражения в then-части и в else-части условного оператора должны принадлежать одному типу.

Условие в определении условного оператора представляет собой любое выражение типа Bool. Примером таких выражений могут служить сравнения. При сравнении можно использовать следующие операторы:

• <, >, <=, >= — эти операторы имеют такой же смысл, как и в языке Си (меньше, больше, меньше или равно, больше или равно).

• == — оператор проверки на равенство.

• /= — оператор проверки на неравенство.

Выражения типа Bool можно комбинировать с помощью общепринятых логических операторов && и || (И и ИЛИ), и функции отрицания not.

Примеры допустимых условий:

Разумеется, можно определять свои функции, возвращающие значения типа Bool, и использовать их в качестве условий. Например, можно определить функцию isPositive, возвращающую True, если ее аргумент неотрицателен и False в противном случае:

Теперь функцию signum можно определить следующим образом:

Отметим, что функцию isPositive можно определить и проще:

Функции многих переменных и порядок определения функций

До сих пор мы определяли функции, принимающие один аргумент. Разумеется, в языке Haskell можно определять функции, принимающие произвольное количество аргументов. Определение функции add, принимающей два целых числа и возвращающей их сумму, выглядит следующим образом:

Тип функции add может выглядеть несколько загадочно. В языке Haskell считается, что операция -> ассоциативна вправо.

Таким образом, тип функции add может быть прочитан как Integer -> (Integer -> Integer), т.е. в соответствие с правилом каррирования, результатом применения функции add к одному аргументу будет функция, принимающая один параметр типа Integer.

Вообще, тип функции, принимающей n аргументов, принадлежащих типам t1, t2, . . . , tn, и возвращающей результат типа a, записывается в виде

t1->t2->...->tn->a.

Следует сделать еще одно замечание, касающееся порядка определения функций. В предыдущем разделе мы определили две функции, signum и isPositive, одна из которых использовала для своего определения другую. Возникает вопрос: какая из этих функций должна быть определена раньше? Напрашивается ответ, что определение isPositive должно предшествовать определению функции signum; однако в действительности в языке Haskell порядок определения функций не имеет значения! Таким образом, функция isPositive может быть определена как до, так и после функции signum.

Ознакомьтесь со следующими функциями:

abs

тип:

abs :: Num a => a -> a

описание:

Возвращает абсолютное значение (модуль) числа.

определение:

abs x

| x >= 0 = x

| otherwise = -x

использование:

Prelude> abs (-3)

3

all

тип:

all :: (a -> Bool) -> [a] -> Bool

описание:

Применяется к предикатам и спискам, возвращает True (истина), если все элементы списка удовлетворяют предикату, и False (ложь) - в противном случае. Подобна оператору any.

определение:

all p xs = and (map p xs)

использование:

Prelude> all (<11) [1..10]

True

Prelude> all isDigit "123abc"

False

and

тип:

and :: [Bool] -> Bool

описание:

Логическое «и» списка значений типа boolean (смотрите также «or»).

определение:

and xs = foldr (&&) True xs

использование:

Prelude> and [True, True, False, True]

False

Prelude> and [True, True, True, True]

True

Prelude> and []

True

any

тип:

any :: (a -> Bool) -> [a] -> Bool

описание:

Применяется к предикатам и спискам, возвращает True (истина), если все элементы списка удовлетворяют предикату, и False (ложь) - в противном случае. Подобна оператору all.

определение:

any p xs = or (map p xs)

использование:

Prelude> any (<11) [1..10]

True

Prelude> any isDigit "123abc"

True

Prelude> any isDigit "alphabetics"

False

atan

тип:

atan :: Floating a => a -> a

описание:

Тригонометрическая функция, инвертирующая tan.

определение:

defined internally.

использование:

Prelude> atan pi

1.26263

break

тип:

break :: (a -> Bool) -> [a] -> ([a],[a])

описание:

Учитывая предикат и список, разбивает список на 2 списка в точке, где предикат впервые удовлетворяет условию. Если предикат никогда не удовлетворяет условию, то в качестве первого элемента возвращается список полностью, а второй представляет собой пустой список ([]).

определение:

break p xs

= span p' xs

where

p' x = not (p x)

использование:

Prelude> break isSpace "hello there fred"

("hello", " there fred")

Prelude> break isDigit "no digits here"

("no digits here","")

ceiling

тип:

ceiling :: (RealFrac a, Integral b) => a -> b

описание:

Возвращает наименьшее целое, не меньшее, чем этот аргумент.

использование:

Prelude> ceiling 3.8

4

Prelude> ceiling (-3.8)

-3

see also:

floor

chr

тип:

chr :: Int -> Char

описание:

Применяется к целым числам диапазона 0 -- 255, возвращает символ по таблице ascii, который соответствует этому коду. Этот оператор противоположен оператору ord. Ошибка может возникнуть в случае выхода за границы диапазона.

определение:

defined internally.

использование:

Prelude> chr 65

'A'

Prelude> (ord (chr 65)) == 65

True

see also:

ord

compare

тип:

compare :: Ord a => a -> a -> Ordering

описание:

Применяется к значениям одинакового типа. Результатом будет: EQ, если два выражения совпадают; GT, если первое выражение строго больше второго; и LT, если первое выражение меньше либо равно второму.

определение:

compare x y

| x == y = EQ

| x < y = LT

| otherwise = GT

использование:

Prelude> compare "aadvark" "zebra"

LT

concat

тип:

concat :: [[a]] -> [a]

описание:

Применяется к списку список, соединяет их вместе, используя оператор ++.

определение:

concat xs = foldr (++) [] xs

использование:

Prelude> concat [[1,2,3], [4], [], [5,6,7,8]]

[1, 2, 3, 4, 5, 6, 7, 8]

concatMap

тип:

concatMap :: (a -> [b]) -> [a] -> [b]

описание:

Учитывая функцию map given a function which maps a value to a list, and a list of elements of the same type as the value, applies the function to the list and then concatenates the result (thus flattening the resulting list).

определение:

concatMap f = concat . map f

использование:

Prelude> concatMap show [1,2,3,4]

"1234"

const

тип:

const :: const :: a -> b -> a

описание:

Создаёт постоянное значение, которое будет соответствовать первому выражению, независимо от значения второго.

определение:

const k _ = k

использование:

Prelude> const 12 "lucky"

12

cos

тип:

cos :: Floating a => a -> a

описание:

Тригонометрическая функция косинуса, аргументы интерпретируются, чтобы быть в радианах.

определение:

defined internally.

использование:

Prelude> cos pi

-1.0

Prelude> cos (pi/2)

-4.37114e-08

digitToInt

тип:

digitToInt :: Char -> Int

описание:

Конвертирует цифры в соответствующее значение целого типа.

определение:

digitToInt :: Char -> Int

digitToInt c

| isDigit c = fromEnum c - fromEnum '0'

| c >= 'a' && c <= 'f' = fromEnum c - fromEnum 'a' + 10

| c >= 'A' && c <= 'F' = fromEnum c - fromEnum 'A' + 10

| otherwise = error "Char.digitToInt: not a digit"

использование:

Prelude> digitToInt '3'

3

div

тип:

div :: Integral a => a -> a -> a

описание:

Целочисленное деление.

определение:

defined internally.

использование:

Prelude> 16 `div` 9

1

Prelude> (-12) `div` 5

-3

замечание:

`div` - такое целочисленное деление, что результат является обрезанным к отрицательной значению.

drop

тип:

drop :: Int -> [a] -> [a]

описание:

Применяется к числу или списку, возвращает список, удалив определённое количество элементов из начала списка. Если список содержит меньше элементов, чем указанное число, то возвращается [].

определение:

drop 0 xs = xs

drop _ [] = []

drop n (_:xs) | n>0 = drop (n-1) xs

drop _ _ = error "PreludeList.drop: negative argument"

использование:

Prelude> drop 3 [1..10]

[4, 5, 6, 7, 8, 9, 10]

Prelude> drop 4 "abc"

""

dropWhile

тип:

dropWhile :: (a -> Bool) -> [a] -> [a]

описание:

Применяется к предикату и списку, возвращает список, удалив из его начала элементы, удовлетворяющие условию предиката.

определение:

dropWhile p [] = []

dropWhile p (x:xs)

| p x = dropWhile p xs

| otherwise = (x:xs)

использование:

Prelude> dropWhile (<5) [1..10]

[5, 6, 7, 8, 9, 10]

elem

тип:

elem :: Eq a => a -> [a] -> Bool

описание:

Применяется к значению и списку, возвращает Истину, если значение находится в списке и Ложь в противном случае. Элементы списка должны иметь тот же тип, как значение.

определение:

elem x xs = any (== x) xs

использование:

Prelude> elem 5 [1..10]

True

Prelude> elem "rat" ["fat", "cat", "sat", "flat"]

False

error

тип:

error :: String -> a

описание:

Применяется к строке, создаёт ошибку в программе с соответствующим сообщением в строке.

определение:

defined internally.

использование:

error "this is an error message"

even

тип:

even :: Integral a => a -> Bool

описание:

Примененный к числовому аргументу, возвращает Истину, если аргумент чётный, и Ложь – в противном случае.

определение:

even n = n `rem` 2 == 0

использование:

Prelude> even 2

True

Prelude> even (11 * 3)

False

exp

тип:

exp :: Floating a => a -> a

описание:

Экспоненциальная функция (exp n эквивалентна en).

определение:

defined internally.

использование:

Prelude> exp 1

2.71828

filter

тип:

filter :: (a -> Bool) -> [a] -> [a]

описание:

Применяется к предикату и списку, возвращает список, содержащий все элементы, которые удовлетворяют предикату.

определение:

filter p xs = [k | k <- xs, p k]

использование:

Prelude> filter isDigit "fat123cat456"

"123456"

flip

тип:

flip :: (a -> b -> c) -> b -> a -> c

описание:

Применяется к бинарной функции, возвращает ту же самую функцию с обратным порядком аргументов.

определение:

flip f x y = f y x

использование:

Prelude> flip elem [1..10] 5

True

floor

тип:

floor :: (RealFrac a, Integral b) => a -> b

описание:

Возвращает самое большое целое число не большее чем его аргумент.

использование:

Prelude> floor 3.8

3

Prelude> floor (-3.8)

-4

see also:

ceiling

foldl

тип:

foldl :: (a -> b -> a) -> a -> [b] -> a

описание:

Складывает список, используя данный двоичный оператор и данное перед списком значение в левоориентированном направлении.

foldl op r [a, b, c] → ((r `op` a) `op` b) `op` c

определение:

foldl f z [] = z

foldl f z (x:xs) = foldl f (f z x) xs

использование:

Prelude> foldl (+) 0 [1..10]

55

Prelude> foldl (flip (:)) [] [1..10]

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

foldr

тип:

foldr :: (a -> b -> b) -> b -> [a] -> b

описание:

Складывает список, используя данный двоичный оператор и данное перед списком значение в правоориентированном направлении.

foldr op r [a, b, c] → a `op` (b `op` (c `op` r))

определение:

foldr f z [] = z

foldr f z (x:xs) = f x (foldr f z xs)

использование:

Prelude> foldr (++) [] ["con", "cat", "en", "ate"]

"concatenate"

fromInt

тип:

fromInt :: Num a => Int -> a

описание:

Конвертирует значение типа Int до числового типа, который находится в классе Num.

использование:

Prelude> (fromInt 3)::Float

3.0

fromInteger

тип:

fromInteger :: Num a => Integer -> a

описание:

Конвертирует значение типа Integer до числового типа, который находится в классе Num.

использование:

Prelude> (fromInteger 10000000000)::Float

1.0e+10

fst

тип:

fst :: (a, b) -> a

описание:

Возвращает первый элемент пары

определение:

fst (x, _) = x

использование:

Prelude> fst ("harry", 3)

"harry"

gcd

тип:

gcd :: Integral a => a -> a -> a

описание:

Возвращает наибольший общий делитель между двумя составными аргументами.

определение:

gcd 0 0 = error "Prelude.gcd: gcd 0 0 is undefined"

gcd x y = gcd' (abs x) (abs y)

where

gcd' x 0 = x

gcd' x y = gcd' y (x `rem` y)

использование:

Prelude> gcd 2 10

2

Prelude> gcd (-7) 13

1

head

тип:

head :: [a] -> a

описание:

Возвращает первый элемент, непустой список. Если применяется к пустому списку, результат ошибочен.

определение:

head (x:_) = x

использование:

Prelude> head [1..10]

1

Prelude> head ["this", "and", "that"]

"this"

id

тип:

id :: a -> a

описание:

Функция идентичности, возвращает значение ее аргумента.

определение:

id x = x

использование:

Prelude> id 12

12

Prelude> id (id "fred")

"fred"

Prelude> (map id [1..10]) == [1..10]

True

init

тип:

init :: [a] -> [a]

описание:

Возвращает все, кроме последнего элемента списка аргументов. Список аргументов должен иметь по крайней мере один элемент. Если init применяется к пустому списку, то происходит ошибка.

определение:

init [x] = []

init (x:xs) = x : init xs

использование:

Prelude> init [1..10]

[1, 2, 3, 4, 5, 6, 7, 8, 9]

isAlpha

тип:

isAlpha :: Char -> Bool

описание:

Применяется к символьному аргументу, возвращает Истину, если символ является буквой, и Ложь – в противном случае.

определение:

isAlpha c = isUpper c || isLower c

использование:

Prelude> isAlpha 'a'

True

Prelude> isAlpha '1'

False

isDigit

тип:

isDigit :: Char -> Bool

описание:

Применяется к символьному аргументу, возвращает Истину, если символ является цифрой, и Ложь – в противном случае.

определение:

isDigit c = c >= '0' && c <= '9'

использование:

Prelude> isDigit '1'

True

Prelude> isDigit 'a'

False

isLower

тип:

isLower :: Char -> Bool

описание:

Применяется к символьному аргументу, возвращает Истину, если символ нижнего регистра, и Ложь – в противном случае.

определение:

isLower c = c >= 'a' && c <= 'z'

использование:

Prelude> isLower 'a'

True

Prelude> isLower 'A'

False

Prelude> isLower '1'

False

isSpace

тип:

isSpace :: Char -> Bool

описание:

Возвращает Истину, если символьный аргумент является одним из символов, приведённых ниже (в определении), Ложь – в противном случае.

определение:

isSpace c = c == ' ' || c == '\t' || c == '\n' ||

c == '\r' || c == '\f' || c == '\v'

использование:

Prelude> dropWhile isSpace " \nhello \n"

"hello \n"

isUpper

тип:

isUpper :: Char -> Bool

описание:

Применяется к символьному аргументу, возвращает Истину, если символ верхнего регистра, и Ложь – в противном случае.

определение:

isUpper c = c >= 'A' && c <= 'Z'

использование:

Prelude> isUpper 'A'

True

Prelude> isUpper 'a'

False

Prelude> isUpper '1'

False

iterate

тип:

iterate :: (a -> a) -> a -> [a]

описание:

итерирует f x, возвращает список следующего вида: [x,f(x),f(f(x)),...].

определение:

iterate f x = x : iterate f (f x)

использование:

Prelude> iterate (+1) 1

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, .....

last

тип:

last :: [a] -> a

описание:

Применяется к непустому списку, возвращает последний элемент списка.

определение:

last [x] = x

last (_:xs) = last xs

использование:

Prelude> last [1..10]

10

lcm

тип:

lcm :: Integral a => a -> a -> a

описание:

Возвращает наименьший общий множитель двух аргументов.

определение:

lcm _ 0 = 0

lcm 0 _ = 0

lcm x y = abs ((x `quot` gcd x y) * y)

использование:

Prelude> lcm 2 10

10

Prelude> lcm 2 11

22

length

тип:

length :: [a] -> Int

описание:

Возвращает количество элементов списка.

определение:

length [] = 0

length (x:xs) = 1 + length xs

использование:

Prelude> length [1..10]

10

lines

тип:

lines :: String -> [String]

описание:

Применяется к списку символов, содержащему новые строки (\n). Возвращает список списков, разделяя исходный в тех местах, где содержится ‘\n’. В результате символы, обозначающие новую строку удаляются.

определение:

lines [] = []

lines (x:xs)

= l : ls

where

(l, xs') = break (== '\n') (x:xs)

ls

| xs' == [] = []

| otherwise = lines (tail xs')

использование:

Prelude> lines "hello world\nit's me,\neric\n"

["hello world", "it's me,", "eric"]

log

тип:

log :: Floating a => a -> a

описание:

Возвращает натуральный логарифм аргумента.

определение:

defined internally.

использование:

Prelude> log 1

0.0

Prelude> log 3.2

1.16315

map

тип:

map :: (a -> b) -> [a] -> [b]

описание:

Учитывая функцию и список любого типа, возвращает список, где каждый элемент - результат применения функции к соответствующему элементу в начальном списке.

определение:

map f xs = [f x | x <- xs]

использование:

Prelude> map sqrt [1..5]

[1.0, 1.41421, 1.73205, 2.0, 2.23607]

max

тип:

max :: Ord a => a -> a -> a

описание:

Применяется к двум значениям одинакового типа. Возвращает максимальное значение этих двух элементов.

определение:

max x y

| x >= y = x

| otherwise = y

использование:

Prelude> max 1 2

2

maximum

тип:

maximum :: Ord a => [a] -> a

описание:

Применяется к непустому списку. Возвращает максимальный элемент списка.

определение:

maximum xs = foldl1 max xs

использование:

Prelude> maximum [-10, 0 , 5, 22, 13]

22

min

тип:

min :: Ord a => a -> a -> a

описание:

Применяется к двум значениям одинакового типа. Возвращает минимальное значение этих двух элементов.

определение:

min x y

| x <= y = x

| otherwise = y

использование:

Prelude> min 1 2

1

minimum

тип:

minimum :: Ord a => [a] -> a

описание:

Применяется к непустому списку. Возвращает минимальный элемент списка.

определение:

minimum xs = foldl1 min xs

использование:

Prelude> minimum [-10, 0 , 5, 22, 13]

-10

mod

тип:

mod :: Integral a => a -> a -> a

описание:

Возвращает остаток от деления двух аргументов.

определение:

defined internally.

использование:

Prelude> 16 `mod` 9

7

not

тип:

not :: Bool -> Bool

описание:

Возвращает логическое отрицание аргумента типа boolean.

определение:

not True = False

not False = True

использование:

Prelude> not (3 == 4)

True

Prelude> not (10 > 2)

False

notElem

описание:

Возвращает True, если элемент, предшествующий этой функции не входит в последующий список.

использование:

Prelude> 3 `notElem` [1,2,3]

False

Prelude> 4 `notElem` [1,2,3]

True

null

тип:

null :: [a] -> Bool

описание:

Возвращает True, если аргументом является пустой список, и False – в противном случае.

определение:

null [] = True

null (_:_) = False

использование:

Prelude> null []

True

Prelude> null (take 3 [1..10])

False

odd

тип:

odd :: Integral a => a -> Bool

описание:

Возвращает True, если аргумент нечётный, и False – в противном случае.

определение:

odd = not . even

использование:

Prelude> odd 1

True

Prelude> odd (2 * 12)

False

or

тип:

or :: [Bool] -> Bool

описание:

Применяется к списку значений типа Boolean. Возвращает логическое «или».

определение:

or xs = foldr (||) False xs

использование:

Prelude> or [False, False, True, False]

True

Prelude> or [False, False, False, False]

False

Prelude> or []

False

ord

тип:

ord :: Char -> Int

описание:

Применяется к символу, возвращает его код из таблицы ascii.

определение:

defined internally.

использование:

Prelude> ord 'A'

65

Prelude> (chr (ord 'A')) == 'A'

True

see also:

chr

pi

тип:

pi :: Floating a => a

описание:

Вещественное число пи.

определение:

defined internally.

использование:

Prelude> pi

3.14159

Prelude> cos pi

-1.0

pred

тип:

pred :: Enum a => a -> a

описание:

Применяется к значениям перечисляемого типа. Возвращает предыдущее значение перечисления. Если аргумент является первым значением, то произойдёт ошибка.

использование:

Prelude> pred 1

0

Prelude> pred True

False

putStr

тип:

putStr :: String -> IO ()

описание:

Принимает строку в качестве аргумента и возвращает как результат ввод/вывод. Побочный эффект применения putStr - то, что строка печатается на экране.

определение:

defined internally.

использование:

Prelude> putStr "Hello World\nI'm here!"

Hello World

I'm here!

product

тип:

product :: Num a => [a] -> a

описание:

Применяется к списку чисел. Возвращает их произведение.

определение:

product xs = foldl (*) 1 xs

использование:

Prelude> product [1..10]

3628800

quot

тип:

quot :: Integral a => a -> a -> a

описание:

Возвращает фактор после целочисленного деления первого аргумента на второй.

определение:

defined internally.

использование:

Prelude> 16 `quot` 8

2

Prelude> quot 16 9

1

rem

тип:

rem :: Integral a => a -> a -> a

описание:

Возвращает остаток от деления первого аргумента на второй.

определение:

defined internally.

использование:

Prelude> 16 `rem` 8

0

Prelude> rem 16 9

7

замечание:

Следующее равенство содержит:

(x `quot` y)*y + (x `rem` y) == x

repeat

тип:

repeat :: a -> [a]

описание:

Учитывая значение, возвращает бесконечный список таких же элементов.

определение:

repeat x

= xs

where xs = x:xs

использование:

Prelude> repeat 12

[12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 ....

replicate

тип:

replicate :: Int -> a -> [a]

описание:

Учитывая целое число (>=0) и значение, возвращает список, содержащий указанное количество раз это значение.

определение:

replicate n x = take n (repeat x)

использование:

Prelude> replicate 3 "apples"

["apples", "apples", "apples"]

reverse

тип:

reverse :: [a] -> [a]

описание:

Применяется к конечному списку любого типа. Возвращает список тех же элементов, но в обратном порядке.

определение:

reverse = foldl (flip (:)) []

использование:

Prelude> reverse [1..10]

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

round

тип:

round :: (RealFrac a, Integral b) => a -> b

описание:

Округляет аргумент к ближайшему целому числу.

использование:

Prelude> round 3.2

3

Prelude> round 3.5

4

Prelude> round (-3.2)

-3

show

тип:

show :: Show a => a -> String

описание:

Преобразовывает значение (которое должно быть членом класса Show), к строковому представлению.

определение:

defined internally.

использование:

Prelude> "six plus two equals " ++ (show (6 + 2))

"six plus two equals 8"

sin

тип:

sin :: Floating a => a -> a

описание:

Тригонометрическая функция синуса.

определение:

defined internally.

использование:

Prelude> sin (pi/2)

1.0

Prelude> ((sin pi)^2) + ((cos pi)^2)

1.0

snd

тип:

snd :: (a, b) -> b

описание:

Возвращает второй элемент из пары элементов.

определение:

snd (_, y) = y

использование:

Prelude> snd ("harry", 3)

3

sort

тип:

sort :: Ord a => [a] -> [a]

описание:

Сортирует элементы списка в порядке возрастания.

использование:

List> sort [1, 4, -2, 8, 11, 0]

[-2,0,1,4,8,11]

замечание:

This is not defined within the Prelude. You must import the List.hs module to use this function.

span

тип:

span :: (a -> Bool) -> [a] -> ([a],[a])

описание:

Учитывая предикат и список, разделяет список на два списка (возвращаются как пара), таких, что элементы в первом берутся из головы списка, пока предикат удовлетворен, а элементы во втором списке - оставшиеся, как только предикат не удовлетворен.

определение:

span p [] = ([],[])

span p xs@(x:xs')

| p x = (x:ys, zs)

| otherwise = ([],xs)

where (ys,zs) = span p xs'

использование:

Prelude> span isDigit "123abc456"

("123", "abc456")

splitAt

тип:

splitAt :: Int -> [a] -> ([a],[a])

описание:

Учитывая целое число (>=0) и список, разделяет, список на два списка (возвращаются как пара) в соответствии с данным целым числом. Если целое число больше, чем длина списка, то возвращается кортеж, содержащий весь список в качестве его первого элемента и пустой список в качестве его второго элемента.

определение:

splitAt 0 xs = ([],xs)

splitAt _ [] = ([],[])

splitAt n (x:xs)

| n > 0 = (x:xs',xs'')

where

(xs',xs'') = splitAt (n-1) xs

splitAt _ _ = error "PreludeList.splitAt: negative argument"

использование:

Prelude> splitAt 3 [1..10]

([1, 2, 3], [4, 5, 6, 7, 8, 9, 10])

Prelude> splitAt 5 "abc"

("abc", "")

sqrt

тип:

sqrt :: Floating a => a -> a

описание:

Возвращает корень из числа.

определение:

sqrt x = x ** 0.5

использование:

Prelude> sqrt 16

4.0

subtract

тип:

subtract :: Num a => a -> a -> a

описание:

Вычитает его первый аргумент из второго.

определение:

subtract = flip (-)

использование:

Prelude> subtract 7 10

3

succ

тип:

succ :: Enum a => a -> a

описание:

Применяется к значению перечисляемого типа. Возвращает последующий аргумент в перечислении. Если его аргумент будет последним, то произойдет ошибка.

определение:

defined internally.

использование:

Prelude> succ 'a'

'b'

Prelude> succ False

True

sum

тип:

sum :: Num a => [a] -> a

описание:

Вычисляет сумму элементов списка.

определение:

sum xs = foldl (+) 0 xs

использование:

Prelude> sum [1..10]

55

tail

тип:

tail :: [a] -> [a]

описание:

Применяется к непустому списку. Возвращает хвост списка.

определение:

tail (_:xs) = xs

использование:

Prelude> tail [1,2,3]

[2,3]

Prelude> tail "hugs"

"ugs"

take

тип:

take :: Int -> [a] -> [a]

описание:

Применяется к целому числу (>=0) и списку. Возвращает указанное число элементов из начала списка. Если список имеет меньше, чем необходимо элементов, то возвращается весь список.

определение:

take 0 _ = []

take _ []= []

take n (x:xs)

| n > 0 = x : take (n-1) xs

take _ _ = error "PreludeList.take: negative argument"

использование:

Prelude> take 4 "goodbye"

"good"

Prelude> take 10 [1,2,3]

[1,2,3]

takeWhile

тип:

takeWhile :: (a -> Bool) -> [a] -> [a]

описание:

Применяется к предикату и списку. Возвращает список, содержащий элементы из начала списка, пока предикат удовлетворен.

определение:

takeWhile p [] = []

takeWhile p (x:xs)

| p x = x : takeWhile p xs

| otherwise = []

использование:

Prelude> takeWhile (<5) [1, 2, 3, 10, 4, 2]

[1, 2, 3]

tan

тип:

tan :: Floating a => a -> a

описание:

Тригонометрическая функция тангенса.

определение:

defined internally.

использование:

Prelude> tan (pi/4)

1.0

toLower

тип:

toLower :: Char -> Char

описание:

Преобразовывает заглавную букву в строчную. Если эта функция будет применена к аргументу, который не является заглавным, то результатом будет тот же аргумент.

определение:

toLower c

| isUpper c = toEnum (fromEnum c - fromEnum 'A' + fromEnum 'a')

| otherwise = c

использование:

Prelude> toLower 'A'

'a'

Prelude> toLower '3'

'3'

toUpper

тип:

toUpper :: Char -> Char

описание:

Преобразовывает строчную букву в заглавную. Если эта функция будет применена к аргументу, который не является строчным, то результатом будет тот же аргумент.

определение:

toUpper c

| isLower c = toEnum (fromEnum c - fromEnum 'a' + fromEnum 'A')

| otherwise = c

использование:

Prelude> toUpper 'a'

'A'

Prelude> toUpper '3'

'3'

truncate

тип:

truncate :: (RealFrac a, Integral b) => a -> b

описание:

Отсекает дробную часть вещественного числа, возвращая только целую часть.

использование:

Prelude> truncate 3.2

3

Prelude> truncate (-3.2)

-3

undefined

тип:

undefined :: a

описание:

Неопределённое значение. Оно является членом каждого типа.

определение:

undefined

| False = undefined

unlines

тип:

unlines :: [String] -> String

описание:

Преобразовывает список строк в единую, помещая символ новой строки между каждой из них.

определение:

unlines xs

= concat (map addNewLine xs)

where

addNewLine l = l ++ "\n"

использование:

Prelude> unlines ["hello world", "it's me,", "eric"]

"hello world\nit's me,\neric\n"

until

тип:

until :: (a -> Bool) -> (a -> a) -> a -> a

описание:

Учитывая предикат, унарную функцию и значение, рекурсивно применяется функция к значению до тех пор, пока предикат не будет удовлетворен. Если предикат никогда не удовлетворяется, вычисления никогда не закончатся.

определение:

until p f x

| p x = x

| otheriwise = until p f (f x)

использование:

Prelude> until (>1000) (*2) 1

1024

unwords

тип:

unwords :: [String] -> String

описание:

Объединяет список строк в единственную, помещая между каждой из них пробел.

определение:

unwords [] = []

unwords ws

= foldr1 addSpace ws

where

addSpace w s = w ++ (' ':s)

использование:

Prelude> unwords ["the", "quick", "brown", "fox"]

"the quick brown fox"

words

тип:

words :: String -> [String]

описание:

Разбивает строку на аргументы и объединяет их в список такой, что каждое слово разграничено одним или более whitespace символами (см. функцию isSpace).

определение:

words s

| findSpace == [] = []

| otherwise = w : words s''

where

(w, s'') = break isSpace findSpace

findSpace = dropWhile isSpace s

использование:

Prelude> words "the quick brown\n\nfox"

["the", "quick", "brown", "fox"]

zip

тип:

zip :: [a] -> [b] -> [(a,b)]

описание:

Применяется к двум спискам. Возвращает список пар, состоящих из соответствующих элементов первого и второго списков. Если два списка имеют различную длину, то длина получающегося списка равна длине самого короткого.

определение:

zip xs ys

= zipWith pair xs ys

where

pair x y = (x, y)

использование:

Prelude> zip [1..6] "abcd"

[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]

zipWith

тип:

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

описание:

Применяется к бинарной функции и двум спискам. Возвращает список, состоящий из применённой функции к соответствующим элементам первого и второго списков.

определение:

zipWith z (a:as) (b:bs) = z a b : zipWith z as bs

zipWith _ _ _ = []

использование:

Prelude> zipWith (+) [1..5] [6..10]

[7, 9, 11, 13, 15]

(!!)

тип:

(!!) :: [a] -> Int -> a

описание:

Учитывая список и число, возвращает элемент списка, позиция которого равна тому же числу.

использование:

Prelude> [1..10] !! 0

1

Prelude> "a string" !! 3

't'

замечание:

the valid subscripts for a list l are: 0 .. (length l) - 1. Therefore, negative subscripts are not allowed, nor are subsripts greater than one less than the length of the list argument. Subscripts out of this range will result in a program error.

(.)

тип:

(.) :: (b -> c) -> (a -> b) -> a -> c

описание:

Составляет две функции в единую.

использование:

Prelude> (sqrt . sum ) [1,2,3,4,5]

3.87298

замечание:

(f.g.h) x is equivalent to f (g (h x)).

(**)

тип:

(**) :: Floating a => a -> a -> a

описание:

Возводит первый аргумент в степень второго. Аргументы должны быть вещественного типа, и результат также будет вещественным.

использование:

Prelude> 3.2**pi

38.6345

(^)

тип:

(^) :: (Num a, Integral b) => a -> b -> a

описание:

Возводит первый аргумент в степень второго. Первый аргумент должен быть числового типа, а второй должен быть целочисленного типа. Результат будет такого же типа, как и первый аргумент.

использование:

Prelude> 3.2^4

104.858

(^^)

тип:

(^^) :: (Fractional a, Integral b) => a -> b -> a

описание:

Возводит первый аргумент в степень второго. Первый аргумент должен быть вещественного типа, а второй должен быть целочисленного типа. Результат будет такого же типа, как и первый аргумент.

использование:

Prelude> 3.142^^4

97.4596

(%)

тип:

(%) :: Integral a => a -> a -> Ratio a

описание:

Берутся два числа целочисленного типа и возвращается самое простое отношение двух.

использование:

Prelude> 20 % 4

5 % 1

Prelude> (5 % 4)^2

25 % 16

(*)

тип:

(*) :: Num a => a -> a -> a

описание:

Возвращает произведение двух аргументов.

использование:

Prelude> 6 * 2.0

12.0

(/)

тип:

(/) :: Fractional a => a -> a -> a

описание:

Возвращает результат деления первого аргумента на второй. Оба аргумента должны быть вещественного типа.

использование:

Prelude> 12.0 / 2

6.0

(+)

тип:

(+) :: Num a => a -> a -> a

описание:

Возвращает сумму аргументов.

использование:

Prelude> 3 + 4

7

Prelude> (4 % 5) + (1 % 5)

1 % 1

(-)

тип:

(-) :: Num a => a -> a -> a

описание:

Возвращает результат вычитания второго аргумента из первого.

использование:

Prelude> 4 - 3

1

Prelude> 4 - (-3)

7

(:)

тип:

(:) :: a -> [a] -> [a]

описание:

Добавляет элемент в начало списка.

использование:

Prelude> 1:[2,3]

[1,2,3]

Prelude> True:[]

[True]

Prelude> 'h':"askell"

"haskell"

(++)

тип:

(++) :: [a] -> [a] -> [a]

описание:

Складывает списки.

использование:

Prelude> [1,2,3] ++ [4,5,6]

[1,2,3,4,5,6]

Prelude> "foo " ++ "was" ++ " here"

"foo was here"

(/=)

тип:

(/=) :: Eq a => a -> a -> Bool

описание:

True, если первый аргумент не равен второму, а в противном случае – False. Равенство определяется оператором ==.

использование:

Prelude> 3 /= 4

True

Prelude> [1,2,3] /= [1,2,3]

False

(==)

тип:

(==) :: Eq a => a -> a -> Bool

описание:

True, если первый аргумент равен второму, а в противном случае – False.

использование:

Prelude> 3 == 4

False

Prelude> [1,2,3] == [1,2,3]

True

(<)

тип:

(<) :: Ord a => a -> a -> Bool

описание:

Возвращает True, если первый аргумент строго меньше второго, а в противном случае – False.

использование:

Prelude> 1 < 2

True

Prelude> 'a' < 'z'

True

Prelude> True < False

False

(<=)

тип:

(<=) :: Ord a => a -> a -> Bool

описание:

Возвращает True, если первый аргумент меньше либо равен второму, а в противном случае – False.

использование:

Prelude> 3 <= 4

True

Prelude> 4 <= 4

True

Prelude> 5 <= 4

False

(>)

тип:

(>) :: Ord a => a -> a -> Bool

описание:

Возвращает True, если первый аргумент строго больше второго, а в противном случае – False.

использование:

Prelude> 2 > 1

True

Prelude> 'a' > 'z'

False

Prelude> True > False

True

(>=)

тип:

(>=) :: Ord a => a -> a -> Bool

описание:

Возвращает True, если первый аргумент больше либо равен второму, а в противном случае – False.

использование:

Prelude> 4 >= 3

True

Prelude> 4 >= 4

True

Prelude> 4 >= 5

False

(&&)

тип:

(&&) :: Bool -> Bool -> Bool

описание:

Возвращает логическую конъюнкцию аргументов типа boolean.

использование:

Prelude> True && True

True

Prelude> (3 < 4) && (4 < 5) && False

False

(||)

тип:

(||) :: Bool -> Bool -> Bool

описание:

Возвращает логическую дизъюнкцию аргументов типа boolean

использование:

Prelude> True || False

True

Prelude> (3 < 4) || (4 > 5) || False

True