Функциональное программирование в углубленном курсе изучения информатики в школе

№50-1,

Педагогические науки

В статье рассматривается особенности функционального программирования и языка F#, при их изучении в углубленном курсе информатики в школе.

Похожие материалы

При изучении информатики в углубленном курсе, возникает необходимость ознакомления школьников с разнообразными технологиями программирования: процедурное, объектно-ориентированное и функциональное.

Функциональным программированием называют как раздел дискретной математики, так и парадигму программирования, в которой процесс вычисления мы можем трактовать, как вычисление значений функции в математическом понимании последней. Математическая функция выражает связь между исходными данными и итогом некоторого процесса. Процесс вычисления аналогичен, ведь он имеет «вход» и «выход», поэтому функция вполне подходящее средство описания вычислений. Данный принцип и стал основным в парадигме функционального программирования: программа может представлять собой набор определенных функций, функции определяются через другие функции или рекурсивно через самих себя, в процессе работы функция получает параметры, обработав их, возвращает результат, при необходимости функция вычисляет значения других функций. На функциональном языке программист не должен описывать порядок вычислений, он описывает только желаемый результат как систему функций.

Выделим свойства функционального языка программирования:

  1. Краткость и простота.
  2. Строгая типизация.
  3. Модульность – разделение программ на несколько сравнительно независимых частей с четко определенными связями между ними.
  4. Функция как значение – функции могут передаваться другим функциям в качестве аргумента.
  5. Вызов по необходимости – каждый аргумент функции вычисляется только в том случае, если его значение необходимо для вычисления результата функции.

Фирма Microsoft обратила внимание на функциональную парадигму и выпустила язык F# (F sharp) интегрировав его в Visual Studio (рис. 1.). F# - это язык программирования, обеспечивающий поддержку функционального, объектно-ориентированного и императивного (процедурного) программирования.

Рисунок 1.

Существует два способа использования F# в Visual Studio:

  1. Создав отдельный проект. При компиляции будет создана соответствующая сборка.
  2. В режиме интерактивного сеанса F# (F# Interactive) - класса инструментов, который принимает код, компилирует его, выполняет и выводит результат. Это позволяет легко и быстро экспериментировать с программным кодом, не создавая новые проекты или полноценные приложения ради того, чтобы увидеть результаты работы фрагмента из нескольких строк (рис.2). Для выполнения кода, необходимо набрать «;;» и нажать «Enter».
Рисунок 2.

Ключевое слово «let» связывает имя со значением, данную операцию называют «операция связывания» (рис.3). При этом, по умолчанию все значения являются константами. F# отличает символы верхнего и нижнего регистров, поэтому два значения, имена которых отличаются только регистром символов, считаются разными. После выполнения в окне F# Interactive все имена созданные в нем, будут выводится в виде:
val <имя> : <тип результата> = <фактическое значение>.

Рисунок 3.

Если для выражения не было задано имя, ему автоматически будет присвоено имя it (рис.4).

Рисунок 4.

Для создания переменных используется параметр mutable – пометка их изменяемости (рис. 5). Ввод значений в переменную осуществляется оператором <- (рис. 5).

Рисунок 5.

Функции определяются следующим синтаксисом:

let <название функции> <список параметров> <: тип возвращаемого значения> = <тело функции>.

Функция для вычисления площади круга приведена рисунке 6.

Рисунок 6.

Особый интерес вызывает возможность создания рекурсивных функций – функций вызывающих самих себя.

Если функция рекурсивна, то ее синтаксис следующий:

let rec <название функции> <список параметров> <: тип возвращаемого значения> = <тело функции>.

Рассмотрим несколько примеров:

Пример 1. Найти все простые делители числа.

let rec del (n:float) (delit: float) : unit =
      if n%delit=0. then printfn "%f" delit
                         del (n/delit) delit
                    else  if n>1. then del n (delit+1.)
                                  else printfn "all"

Пример 2. Создание чисел Фибоначчи.

let rec fib n = if n<3 then 1 else fib (n-1) + fib (n-2);;

Пример 3. Печать всех целых чисел от A до B.

 let rec aa  a b =
    if b>a then printfn "%A" a
                aa (a+1) b;; 

Пример 4. Если число является степенью числа два то написать «Yes» иначе «No». Вывести степень исследуемого числа.

При вводе необходимо вводить проверяемое число и число и 0.

let rec st (n:float) (stepen: float) : unit =
      if n=1. then  printfn "Yes %f" stepen
              else if (n%2.<>0.) then printfn "No"
                     else st (n/2.) (stepen+1);;

Функция, вычисляющая факториал рекурсивно, путем сравнения с образцами приведена на рисунке 7. Для вывода на экран результата используется оператор вывода данных на консоль printfn.

Рисунок 7.

Язык F# позволяет легко реализовать композиции функций (функции состоящие из других функций). На рис. 8 приведен пример конвейеризации – объединения вызовов функций в цепочке последовательных операций – F2(F1(x)).

Рисунок 8.

Кроме класса функций, которые именует пользователь для их последующего вызова в теле программы, существуют специализированные неименованные функции – «лямбда-выражение». Они используются когда нет необходимости в создании большого количества функций и необходимо вычисление с переменной.

Синтаксис fun <параметры> -> <тело функции>.

На рис 9. приведены примеры использования лямбда-выражений.

Рисунок 9.

Модуль List из стандартной библиотеки содержит множество методов упрощающих обработку списков. Списки можно задавать аналогично заданию функций.

Синтаксис: let <имя> = [список].

List.map – операция проекции, которая создает новый список на основе заданной функции. На рис. 10 приведен пример создания списка квадратов чисел на основе списка чисел.

Рисунок 10.

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

Список литературы

  1. Александрова Н. Организация самостоятельной деятельности студентов с применением ДО / С. Галаев, Н. Александрова, А. Букушева // Высшее образование в России. 2007. № 10. С. 141-143.
  2. Александрова Н.А. Концепция собственного образовательного стандарта прикладного бакалавриата по направлению подготовки 050100.62 «Педагогическое образование» (профиль «Информатика») / Н.А.Александрова, Е.В.Кудрина, М.В.Храмова, А.Г. Фёдорова // В сборнике: Компьютерные науки и информационные технологии Материалы Международной научной конференции. Ответственные за выпуск: Т.В. Семенова, А.Г. Федорова. 2014. С. 19-23.
  3. Александрова Н.А. Об использовании технологических средств и информационно-коммуникационных технологий в инклюзивном обучении студентов / Н.А. Александрова, Е.А. Гаврилова // В сборнике: Информационные технологии в образовании Материалы VI Всероссийской научно-практической конференции. Саратовский государственный университет имени Н.Г. Чернышевского. 2014. С. 61-63.
  4. Векслер В.А. Принципы регулирования рынка образовательных услуг // Л.Б. Рейдель, В.А. Векслер Правовая политика и правовая жизнь. 2013. № 2. С. 36-41.
  5. Векслер В.А. Содержание и организация обучения взрослых основам информационных технологий в системе дополнительного образования: региональный аспект // диссертация на соискание ученой степени кандидата педагогических наук / Амур. гуманитар.-пед. гос. ун-т. Комсомольск-на-Амуре, 2009