Шаг 42.
Основы языка Haskell.
Основные функции библиотеки Prelude. Преобразователи символов

    На этом шаге мы рассмотрим функции этого типа.

    К этому типу функций относятся следующие функции.

  1. Функция, преобразующая алфавитный символ в верхнем регистре в соответствующий строчный алфавитный символ. Если функция применена к аргументу, который не является строчным символом латинского алфавита, то возвращается символ без изменений:
       toLower:: Char -> Char
       toLower s
    
    Например:
       > toLower 'A'   > toLower 'b'   > toLower '3'
       'a'             'b'             '3'
    

    Замечание. В версии интерпретатора Haskell (май, 2006) требуется подключить модуль Char.
  2. Функция, преобразующая алфавитный символ в нижнем регистре в соответствующий заглавный алфавитный символ. Если функция применена к аргументу, который не является строчным символом латинского алфавита, то возвращается символ без изменений:
       toUpper:: Char -> Char
       toUpper s
    
    Например:
       > toUpper 'a'   > toUpper 'B'   > toUpper '3'
       'A'             'B'             '3'
    

    Замечание. В версии интерпретатора Haskell (май, 2006) требуется подключить модуль Char.
  3. Функция, возвращающая символьное представление заданной "цифры" 0,1,2,...,15:
       intToDigit:: Int -> Char
       intToDigit n
    
    Например:
       > intToDigit 0   > intToDigit 10   > intToDigit 15
       '0'              'a'               'f'
    

    Замечание. В версии интерпретатора Haskell (май, 2006) требуется подключить модуль Char.
  4. Функция, преобразующая символьное представление десятичной цифры в соответствующее целое значение:
       digitToInt:: Char -> Int
       digitToInt c
    
    Например:
       > digitToInt '0'   > digitToInt '1'   > digitToInt '9'
       0                  1                  9
    

    Замечание. В версии интерпретатора Haskell (май, 2006) требуется подключить модуль Char.
  5. Функция, возвращающая ASCII-код символа:
       ord:: Char -> Int
       ord s
    
    Например:
       > ord '$'   > ord '\r'   > ord '\n'
       36          13           10
    
    Определена примитивом в трансляторе.
    Замечание. В версии интерпретатора Haskell (май, 2006) требуется подключить модуль Char.
  6. Функция, возвращающая символ по указанному целому числу (коду символа) из диапазона от 0 до 255. Если функция будет применена к целому числу, находящемуся за пределами заданного интервала, то выводится сообщение об ошибке:
       chr:: Int -> Char
       chr n
    
    Например:
       > chr 10   > chr 13   > chr 36
       '\n'       '\r'       '$'
    

    Замечание. В версии интерпретатора Haskell (май, 2006) требуется подключить модуль Char.

    В заключение этого шага приведем примеры использования указанных функций.

   -- Демонстрация применения функций из библиотеки 
   -- 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'
Файл с примерами можно взять здесь.

    На следующем шаге мы рассмотрим операции аппликации.




Предыдущий шаг Содержание Следующий шаг