На этом шаге мы рассмотрим функции этого типа.
К этому типу функций относятся следующие функции.
toLower:: Char -> Char toLower s
> toLower 'A' > toLower 'b' > toLower '3' 'a' 'b' '3'
toUpper:: Char -> Char toUpper s
> toUpper 'a' > toUpper 'B' > toUpper '3' 'A' 'B' '3'
intToDigit:: Int -> Char intToDigit n
> intToDigit 0 > intToDigit 10 > intToDigit 15 '0' 'a' 'f'
digitToInt:: Char -> Int digitToInt c
> digitToInt '0' > digitToInt '1' > digitToInt '9' 0 1 9
ord:: Char -> Int ord s
> ord '$' > ord '\r' > ord '\n' 36 13 10
chr:: Int -> Char chr n
> chr 10 > chr 13 > chr 36 '\n' '\r' '$'
В заключение этого шага приведем примеры использования указанных функций.
-- Демонстрация применения функций из библиотеки -- Prelude (2001) ------------------------------------------ -- Функция, преобразующая целое число типа -- Integer в число с плавающей точкой ------------------------------------- f1:: Integer -> Float f1 x = fromInteger x ------------------------------------------ -- Функция, преобразующая целое число типа -- Int в число с плавающей точкой --------------------------------- f2:: Int -> Float f2 x = fromInt x ------------------------------------------ -- Функция, преобразующая целое число типа -- Integer в число с плавающей точкой ------------------------------------- f3:: Integer -> Double f3 x = fromInteger x --------------------------------------------- -- Функция, возвращающая значения логарифма x -- по заданному положительному основанию a, -- отличному от единицы (первый способ) --------------------------------------- f4:: Double -> Double -> Double f4 a x = logBase a x --------------------------------------------- -- Функция, возвращающая значения логарифма x -- по заданному положительному основанию a, -- отличному от единицы (второй способ) --------------------------------------- f4':: Double -> Double -> Double f4' a x = (log x)/(log a) ------------------------------------------------- -- Функция, возвращающая наименьшее общее кратное -- двух целых чисел (нельзя пользоваться функцией -- lcm) ------------------------------------ lcm':: Integer -> Integer -> Integer lcm' x y = abs ((x*y) `div` (gcd x y)) ------------------------------------------------ -- Демонстрация различия функций rem и mod, воз- -- вращающих остаток от деления целых чисел -- (функция возвращает два значения) ------------------------------------ prov:: Int -> Int -> (Int,Int) prov a b = (a `rem` b,a `mod` b) --------------------------------------------------- -- Демонстрация аппроксимации числа Pi несократимой -- правильной дробью с точностью delta -------------------------------------- approxPI:: Float -> (Integer,Integer) approxPI delta = (numerator a, denominator a) where a = approxRational pi delta --------------------------------------- -- Неудачные тестовые примеры: ----------------------------------------- test1 = "Results:"++" "++show (prov 23 9) ++" "++show (prov (-23) 9) ++" "++show (prov 23 (-9)) ------------------------------------------------- test2 = (approxPI 0.002, approxPI 0.0000000001, approxPI 0.00000000000000000001) ----------------------------------------- test3 = f4 (exp 1) ((exp 1)**12.0) test4 = f4' (exp 1) ((exp 1)**12.0) test5 = f4' 10.0 1000.0 test6 = lcm' 10 1000 test7 = lcm' 0 10
-- Демонстрация моделирования предикатов -- для работы с символами --------------------------------------- import Prelude hiding (isAlpha,isUpper, isLower,isDigit) --------------------------------------- isAlpha:: Char -> Bool isAlpha c = isUpper c || isLower c ---------------------------------- isUpper:: Char -> Bool isUpper c = c>='A' && c<='Z' ---------------------------- isLower:: (->) Char Bool isLower c = c>='a' && c<='z' ---------------------------- isDigit:: Char -> Bool isDigit ch = ord ch >=48 && ord ch<=57 -------------------------------------------------------- -- Функция, возвращающая по коду символа соответствующий -- символ в "противоположном" регистре -------------------------------------- abc:: Int -> Char abc n | not (isAlpha w) = error "Не алфавитный символ" | isLower w = toUpper w | True = toLower w where w = chr n -------------------------------------------- -- Неудачные тестовые примеры: ------------------------------------ test1 = isAlpha 'a' && isAlpha 'F' && isUpper 'B' && isLower 'a' ------------------------------------ test2 = abc 65=='a' && abc 90=='z' && abc 97=='A' && abc 122=='Z' ------------------------------------- test3 = isDigit '4' && isDigit '7' && isDigit '9'
На следующем шаге мы рассмотрим операции аппликации.