войти зарегистрироваться

HaskellРешение задачи о перегорающих лампочках на языке Haskell

Своё первое эссе на Хаброхабре я хотел бы посвятить решению задачи, заданной мною на ноябрьском конкурсе по функциональному программированию, который я традиционно устраиваю на ежемесячной основе в своей уютненькой жэжэшечке. Задача была такова:

Дан индикатор, состоящий из n лампочек, которые могут гореть или не гореть. Дан алфавит из k символов, которые закодированы различными комбинациями горящих и не горящих лампочек на индикаторе. Необходимо определить максимальное число лампочек индикатора p (p <= n) и указать эти лампочки, которые, если и перегорят, то не влияют на однозначное распознавание всех символов алфавита.

РазработкаИспользуете ли вы REPL?

Проголосовало 638 человек. Воздержалось 49 человек.

JavaScriptЗамыкания и объекты JavaScript. Переизобретаем интерпретатор

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

Когда в изучении языка доходишь до нетривиальных вещей, бывает полезно сместить уровень абстракции, чтобы понять, как на самом деле всё устроено. Ведь, по большому счету, любые понятия и конструкции языков сколь угодно высоко уровня сводятся к старому доброму машинному коду. Писать в объектно-ориентированном или функциональном стиле можно и на чистом C, и даже на ассемблере. Грубо говоря, любой высокоуровневый язык — это зафиксированный на уровне компилятора или интерпретатора набор синтаксических карамелек и шоколадок. Повышение уровня абстракции позволяет писать более сложные программы с меньшими усилиями, но вот понять в начале пути, что конкретно имеется в виду под наследованием или замыканием, как это всё работает и почему, гораздо легче, разобравшись, каким образом всё это реализовано.

JavaScript, как никакой другой язык, нуждается в именно таком объяснении. Функциональная природа, скрытая за Си-подобным синтаксисом, и непривычная прототипная модель наследования поначалу сильно сбивают с толку. Давайте мысленно понизим уровень JavaScript до простого процедурного, наподобие Си. Отталкиваясь от этого «недоязыка», переизобретем функциональное и объектно-ориентированное программирование.

HaskellКак часто вам приходится производить рефакторинг кода на Haskell?

Проголосовало 187 человек. Воздержалось 265 человек.

ПрограммированиеЖемчужины функционального программирования: рисуем деревья

В этой статье я собираюсь поведать читателям о рисовании деревьев. Нет, не тех деревьев, которые растут из почвы и в которых селятся белки. Сегодня мы будем визуализировать деревья как структуры данных. Данная статья написана по мотивам статьи 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# не ленится :(

Вот код:

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