Haskell → Решение задачи о перегорающих лампочках на языке Haskell
Своё первое эссе на Хаброхабре я хотел бы посвятить решению задачи, заданной мною на ноябрьском конкурсе по функциональному программированию, который я традиционно устраиваю на ежемесячной основе в своей уютненькой жэжэшечке. Задача была такова:
Дан индикатор, состоящий из n лампочек, которые могут гореть или не гореть. Дан алфавит из k символов, которые закодированы различными комбинациями горящих и не горящих лампочек на индикаторе. Необходимо определить максимальное число лампочек индикатора p (p <= n ) и указать эти лампочки, которые, если и перегорят, то не влияют на однозначное распознавание всех символов алфавита.
JavaScript → Замыкания и объекты JavaScript. Переизобретаем интерпретатор
Обычно концепции или парадигмы программирования объясняют либо описательно — «разжёвывая» новые идеи простыми словами, либо метафорически — уподобляя их хорошо знакомым аудитории предметам и понятиям. Но ни первый, ни второй способ не дает такого точного и полного представления о предмете, как взгляд с точки зрения низкоуровневой реализации. Когда в изучении языка доходишь до нетривиальных вещей, бывает полезно сместить уровень абстракции, чтобы понять, как на самом деле всё устроено. Ведь, по большому счету, любые понятия и конструкции языков сколь угодно высоко уровня сводятся к старому доброму машинному коду. Писать в объектно-ориентированном или функциональном стиле можно и на чистом C, и даже на ассемблере. Грубо говоря, любой высокоуровневый язык — это зафиксированный на уровне компилятора или интерпретатора набор синтаксических карамелек и шоколадок. Повышение уровня абстракции позволяет писать более сложные программы с меньшими усилиями, но вот понять в начале пути, что конкретно имеется в виду под наследованием или замыканием, как это всё работает и почему, гораздо легче, разобравшись, каким образом всё это реализовано.
JavaScript, как никакой другой язык, нуждается в именно таком объяснении. Функциональная природа, скрытая за Си-подобным синтаксисом, и непривычная прототипная модель наследования поначалу сильно сбивают с толку. Давайте мысленно понизим уровень JavaScript до простого процедурного, наподобие Си. Отталкиваясь от этого «недоязыка», переизобретем функциональное и объектно-ориентированное программирование.
Программирование → Жемчужины функционального программирования: рисуем деревья
В этой статье я собираюсь поведать читателям о рисовании деревьев. Нет, не тех деревьев, которые растут из почвы и в которых селятся белки. Сегодня мы будем визуализировать деревья как структуры данных. Данная статья написана по мотивам статьи Andrew Kennedy «Functional Pearls: Drawing Trees» из журнала Journal of Functional Programming, 6(3): 527-534, Cambridge University Press, May 1996 (электронная версия статьи тут), и является, в некотором роде, её переводом.
Персональные блоги → Списки и другие структуры данных в Ocaml
Введение
Кроме базовых типов данных в Objective Caml к предопределенным типам относятся кортеж, список, запись.
Персональные блоги → Ocaml. Типы данных
Введение
В этом посте перейдем непосредственно к ознакомлению с языком Objective Caml. В этом посте будет рассказано об базовых типах данных Objective Caml.
Для начала вам необходимо скачать и установить Objective Caml, на этом этапе достаточно будет одного интерпретатора. Запуск интерпретатора производится с помощью: команды ocaml, если дело происходит в *nix, либо запуска ocaml.exe если дело происходит в Windows.
После запуска интерпретатора мы увидим следующее: версию Ocaml, у меня это Objective Caml version 3.00, и ожидание ввода команд:#.
Каждая логическая единица кода — фраза, заканчивается в Objective Caml — ;; Выход из интерпретатора, осуществляется либо по нажатию Сtrl+D, либо после вызова функции exit типа int -> int:
exit 0;;
Персональные блоги → Objective CAML
Objective CAML — один из гибридных языков программирования, то есть поддерживающий несколько парадигм программирования, в данном случае у нас это объектно-ориентированное программирование и функциональное программирование. Как известно, сильными сторонами функционального программирования являются: надежность кода, удобство тестирования, возможность оптимизации при компиляции и т.д. Но несмотря на все достоинства функционального программирования, так же присутствуют и минусы, такие как: отличающийся стиль написания программ от императивного, зачастую нехватка хорошей литературы, неудобный синтаксис и т.д.
Если кого — либо заинтересует, рискну рассказать по подробнее об этом языке программирования.
Если кого — либо заинтересует, рискну рассказать по подробнее об этом языке программирования.
Персональные блоги → F# не ленится :(
Вот код:
При компиляции и запуске он, вместо того, чтобы полностью рассчитать первую лямбда-функцию с N = 0 на кой-то черт рассчитывает никому не нужные значения N, меньшие нуля!
Что происходит? Может быть, «ленивость» можно как-то форсировать?
let rec Y func tracker args =
func args (Y func tracker (tracker args))
let fib N = (fun (x, y) -> x) (Y
(fun N (prev, pprev) -> if N = 1 then (1, 0) else (prev + pprev, prev))
(fun N -> N - 1)
N)
let main =
let value = fib 10
System.Console.WriteLine(value)
System.Console.ReadKey()
При компиляции и запуске он, вместо того, чтобы полностью рассчитать первую лямбда-функцию с N = 0 на кой-то черт рассчитывает никому не нужные значения N, меньшие нуля!
Что происходит? Может быть, «ленивость» можно как-то форсировать?
Персональные блоги → Y-комбинатор, упрощение интерфейса
Итак, все мы помним, что такое Y-комбинатор (кто не помнит, это комбинатор неподвижной точки или Y g = g Y g). Из математической его записи следует некоторая проблема: он генерирует последовательность g g g… g Y g, в которой каждый следующий шаг может использовать лишь результат предыдущего вычисления да захваченный из комбинатора кусок контекста — что приводит к необходимости для каждой функции писать свой собственный комбинатор.
Идея заключается в том, чтобы написать Y-комбинатор, который не будет зависеть от самоприменяемой функции.
Идея заключается в том, чтобы написать Y-комбинатор, который не будет зависеть от самоприменяемой функции.