<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Результаты поиска по запросу «[ocaml]»]]></title>
    <link>https://habr.com/ru/</link>
    <description><![CDATA[Результаты поиска по запросу «[ocaml]»]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Tue, 09 Jun 2026 18:32:28 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    
    <item>
      <title><![CDATA[Objective CAML]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/74488/</guid>
      <link>https://habr.com/ru/articles/74488/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=74488</link>
      <description><![CDATA[Objective CAML — один из гибридных языков программирования, то есть поддерживающий несколько парадигм программирования, в данном случае у нас это объектно-ориентированное программирование и функциональное программирование. Как известно, сильными сторонами функционального программирования являются: надежность кода, удобство тестирования, возможность оптимизации при компиляции и т.д. Но несмотря на все достоинства функционального программирования, так же присутствуют и минусы, такие как: отличающийся стиль написания программ от императивного, зачастую нехватка хорошей литературы, неудобный синтаксис и т.д. <br/>
Если кого — либо заинтересует, рискну рассказать по подробнее об этом языке программирования. <a href="https://habr.com/ru/articles/74488/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=74488#habracut"></a>]]></description>
      
      <pubDate>Fri, 06 Nov 2009 13:48:32 GMT</pubDate>
      <dc:creator><![CDATA[SHK]]></dc:creator>
      <category><![CDATA[Чулан]]></category>
      <category><![CDATA[OCaml]]></category><category><![CDATA[ФП]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Ocaml Tools]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/74501/</guid>
      <link>https://habr.com/ru/articles/74501/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=74501</link>
      <description><![CDATA[Сегодня я постараюсь рассказать вам об инструментах, помогающих программировать на Objective CAML.<br/>
 <a href="https://habr.com/ru/articles/74501/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=74501#habracut">Продолжение</a>]]></description>
      
      <pubDate>Fri, 06 Nov 2009 14:59:52 GMT</pubDate>
      <dc:creator><![CDATA[SHK]]></dc:creator>
      <category><![CDATA[Чулан]]></category>
      <category><![CDATA[Ocaml]]></category><category><![CDATA[Ocaml Tools]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Списки и другие структуры данных в Ocaml]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/74691/</guid>
      <link>https://habr.com/ru/articles/74691/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=74691</link>
      <description><![CDATA[<h4>Введение</h4><br/>
Кроме базовых типов данных в Objective Caml к предопределенным типам относятся кортеж, список, запись. <br/>
 <a href="https://habr.com/ru/articles/74691/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=74691#habracut">Продолжение</a>]]></description>
      
      <pubDate>Mon, 09 Nov 2009 06:08:51 GMT</pubDate>
      <dc:creator><![CDATA[SHK]]></dc:creator>
      <category><![CDATA[Чулан]]></category>
      <category><![CDATA[Ocaml]]></category><category><![CDATA[ФП]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[PG'OCAML = PostgreSQL + OCaml]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/75599/</guid>
      <link>https://habr.com/ru/articles/75599/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=75599</link>
      <description><![CDATA[Cегодня понадобилось обратиться к базе данных PostgreSQL из Objective Caml, наиболее удобным и продвинутым фремворком для работы с PostgreSQL оказался — PG'OCAML. В этом посте хотелось бы показать пару примеров связки Objective Caml и PostgreSQL и насколько это просто.<br/>
 <a href="https://habr.com/ru/articles/75599/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=75599#habracut">Продолжение</a>]]></description>
      
      <pubDate>Wed, 18 Nov 2009 08:29:38 GMT</pubDate>
      <dc:creator><![CDATA[SHK]]></dc:creator>
      <category><![CDATA[Чулан]]></category>
      <category><![CDATA[Ocaml]]></category><category><![CDATA[postgresql + ocaml]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Взлом TLS с денежным призом]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/250339/</guid>
      <link>https://habr.com/ru/articles/250339/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=250339</link>
      <description><![CDATA[<img src="https://habrastorage.org/files/7d7/850/46a/7d785046a3ec489f946cd4f8a9346ab3.png" align="right"/>Разработчики <a href="https://github.com/mirleft/ocaml-tls">TLS-имплементации на языке OCaml</a> объявили конкурс BTC Piñata, чтобы доказать надёжность своей защиты. Известно, что конкурсы не могут быть настоящим доказательством, но этот очень уж забавный, да ещё с небольшим денежным призом.<br/>
<br/>
Итак, <a href="http://media.ccc.de/browse/congress/2014/31c3_-_6443_-_en_-_saal_2_-_201412271245_-_trustworthy_secure_modular_operating_system_engineering_-_hannes_-_david_kaloper.html#video">двое хакеров</a> открыли демо-сервер <a href="http://ownme.ipredator.se/">ownme.ipredator.se</a>.<br/>
<br/>
На сервере лежит ключ от биткоин-адреса <a href="https://blockchain.info/address/183XuXTTgnfYfKcHbJ4sZeF46a49Fnihdh">183XuXTTgnfYfKcHbJ4sZeF46a49Fnihdh</a>. Сервер отдаст нам ключ, если мы предъявим сертификат.<br/>
<br/>
Организаторы предусмотрели механизм MiTM для нас. Мы можем пропускать через себя трафик между виртуальными машинами BTC Piñata (TLS-сервер и TLS-клиент). Как понятно, в этом трафике есть нужный сертификат, нужно его только извлечь каким-то образом.<br/>
 <a href="https://habr.com/ru/articles/250339/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=250339#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 11 Feb 2015 13:30:46 GMT</pubDate>
      <dc:creator><![CDATA[alizar]]></dc:creator>
      <category><![CDATA[Информационная безопасность]]></category><category><![CDATA[Криптография]]></category>
      <category><![CDATA[OCaml]]></category><category><![CDATA[TLS]]></category><category><![CDATA[BTC Piñata]]></category><category><![CDATA[конкурс]]></category>
    </item>
  

  

  

	
  

  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Как я нашёл баг в процессорах Intel Skylake]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/332552/</guid>
      <link>https://habr.com/ru/articles/332552/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=332552</link>
      <description><![CDATA[<img src="https://habrastorage.org/web/f82/7b2/c1a/f827b2c1a23a435d9696abb154b87894.jpg" align="left">Инструкторы курсов «Введение в программирование» знают, что студенты находят любые причины для ошибок своих программ. Процедура сортировки отбраковала половину данных? «Это может быть вирус в Windows!» Двоичный поиск ни разу не сработал? «Компилятор Java сегодня странно себя ведёт!» Опытные программисты очень хорошо знают, что баг обычно в их собственном коде, иногда в сторонних библиотеках, очень редко в системных библиотеках, крайне редко в компиляторе и никогда — в процессоре. Я тоже так думал до недавнего времени. Пока не столкнулся с багом в процессорах Intel Skylake, когда занимался отладкой таинственных сбоев OCaml.<br>
<br>
<h1>Первое проявление</h1><br>
В конце апреля 2016 года вскоре после выпуска OCaml 4.03.0 один Очень Серьёзный Индустриальный Пользователь OCaml (ОСИП) обратился ко мне в частном порядке с плохими новостями: одно из наших приложений, написанное на OCaml и скомпилированное в OCaml 4.03.0, падало случайным образом. Не при каждом запуске, но иногда вылетал segfault, в разных местах кода. Более того, сбои наблюдались только на их самых новых компьютерах, которые работали на процессорах Intel Skylake (Skylake — это кодовое название последнего на тот момент поколения процессоров Intel. Сейчас последним поколением является Kaby Lake).<br>
<br>
За последние 25 лет мне сообщали о многих багах OCaml, но это сообщение вызывало особенное беспокойство. Почему только процессоры Skylake? В конце концов, я даже не мог воспроизвести сбои в бинарниках ОСИПа на компьютерах в моей компании Inria, потому что все они работали на более старых процессорах Intel. Почему сбои не воспроизводятся? Однопоточное приложение ОСИПа делает сетевые и дисковые операции I/O, так что его выполнение должно быть строго детерминировано, и любой баг, который вызвал segfault, должен проявлять себя при каждом запуске в том же месте кода.<br> <a href="https://habr.com/ru/articles/332552/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=332552#habracut">Читать дальше →</a>]]></description>
      
      <pubDate>Thu, 06 Jul 2017 12:24:53 GMT</pubDate>
      <dc:creator><![CDATA[m1rko]]></dc:creator>
      <category><![CDATA[Assembler]]></category><category><![CDATA[C]]></category><category><![CDATA[Компиляторы]]></category><category><![CDATA[Отладка]]></category><category><![CDATA[Тестирование IT-систем]]></category>
      <category>OCaml</category><category>Caml</category><category>Skylake</category><category>Hyper-Threading</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Сравнение одинакового проекта в Rust, Haskell, C++, Python, Scala и OCaml]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/456638/</guid>
      <link>https://habr.com/ru/articles/456638/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=456638</link>
      <description><![CDATA[В последнем семестре университета я выбрал <a href="https://www.student.cs.uwaterloo.ca/~cs444/">курс компиляторов CS444</a>. Там каждая группа из 1-3 человек должна была написать компилятор из существенного подмножества Java в x86. Язык на выбор группы. Это была редкая возможность сравнить реализации больших программ одинаковой функциональности, написанных очень компетентными программистами на разных языках, и сравнить разницу в дизайне и выборе языка. Такое сравнение породило массу интересных мыслей. Редко можно встретить такое контролируемое сравнение языков. Оно не идеально, но намного лучше, чем большинство субъективных историй, на которых основано мнение людей о языках программирования.<br>
<br>
Мы сделали наш компилятор на Rust, и сначала я сравнил его с проектом команды на Haskell. Я ожидал, что их программа будет намного короче, но она оказалась того же размера или больше. То же самое для OCaml. Затем сравнил с компилятором на C++, и там вполне ожидаемо компилятор был примерно на 30% больше, в основном, из-за заголовков, отсутствия типов sum и сопоставлений с образцом. Следующее сравнение было с моей подругой, которая сделала компилятор самостоятельно на Python и использовала менее половины кода, по сравнению с нами, из-за мощности метапрограммирования и динамических типов. У другого товарища программа на Scala тоже была меньше нашей. Больше всего меня удивило сравнение с другой командой, которая тоже использовала Rust, но у них оказалось в три раза больше кода из-за разных дизайнерских решений. В конце концов, самая большая разница в количестве кода оказалась в пределах одного языка!<br> <a href="https://habr.com/ru/articles/456638/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=456638#habracut">Читать дальше →</a>]]></description>
      
      <pubDate>Tue, 18 Jun 2019 16:32:26 GMT</pubDate>
      <dc:creator><![CDATA[m1rko]]></dc:creator>
      <category><![CDATA[Haskell]]></category><category><![CDATA[Python]]></category><category><![CDATA[Rust]]></category><category><![CDATA[Scala]]></category><category><![CDATA[Компиляторы]]></category>
      <category>Rust</category><category>Haskell</category><category>C++</category><category>Python</category><category>Scala</category><category>OCaml</category><category>компиляторы</category>
    </item>
  

  

    
    <item>
      <title><![CDATA[Формальная верификация кода на Coq: тактики]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/748720/</guid>
      <link>https://habr.com/ru/articles/748720/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=748720</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/29b/ee5/57a/29bee557a2ef545fa1f27271ccbcca97.png" /><p>Данная статья является адаптированным переводом моей статьи: <a href="https://formal-land.gitlab.io/coq-tezos-of-ocaml/blog/2022/02/26/simulations-dependently-typed-version" rel="noopener noreferrer nofollow">Formalization of code in Coq - tactics</a>, написанной в период работы над проектом coq-tezos-of-ocaml. </p><p>Суть проекта: часть <a href="https://gitlab.com/tezos/tezos/-/tree/master/src/proto_alpha/lib_protocol" rel="noopener noreferrer nofollow">исходного кода  протокола </a><a href="https://tezos.com/" rel="noopener noreferrer nofollow">криптовалюты Tezos</a> была переведена на <a href="https://coq.inria.fr/" rel="noopener noreferrer nofollow">Coq</a>, а затем верифицирована с помощью математических методов и формальной логики.   </p><p>Статья предназначена для круга читателей, имеющих опыт работы с Coq.</p><p>Часто процесс формальной верификации становится утомительным и монотонным из за повторяющихся действий, которые пруф-инженеру (от английского слова <em>proof</em> - доказательство) приходится выполнять. К счастью, в Coq есть инструменты и техники автоматизации доказательств, которые позволяют не только значительно  увеличить производительность, но и сделать доказательства короче.</p><p>В данной статье мы покажем, как использовать и писать тактики на примере формальной верификации исходного кода криптовалюты <a href="https://tezos.com/" rel="noopener noreferrer nofollow">Tezos</a> (написанной на OCaml), а именно, мы затронем следующие темы:</p><p></p> <a href="https://habr.com/ru/articles/748720/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=748720#habracut">Читать далее</a>]]></description>
      
      <pubDate>Tue, 18 Jul 2023 10:00:45 GMT</pubDate>
      <dc:creator><![CDATA[Natasha_Klaus]]></dc:creator>
      <category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[Coq]]></category><category><![CDATA[OCaml]]></category><category><![CDATA[formal verification]]></category><category><![CDATA[формальная верификация]]></category><category><![CDATA[proof engineer]]></category><category><![CDATA[пруф-инженер]]></category><category><![CDATA[тактики в Coq]]></category><category><![CDATA[LTac]]></category><category><![CDATA[формальная верификация криптовалют]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Ocaml. Типы данных]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/74574/</guid>
      <link>https://habr.com/ru/articles/74574/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=74574</link>
      <description><![CDATA[<h4>Введение</h4><br/>
В этом посте перейдем непосредственно к ознакомлению с языком Objective Caml. В этом посте будет рассказано об базовых типах данных Objective Caml.<br/>
Для начала вам необходимо скачать и установить Objective Caml, на этом этапе достаточно будет одного <a href="http://caml.inria.fr/ocaml/release.en.html">интерпретатора</a>. Запуск интерпретатора производится с помощью: команды <b>ocaml</b>, если дело происходит в *nix, либо запуска ocaml.exe если дело происходит в Windows.<br/>
После запуска интерпретатора мы увидим следующее: версию Ocaml, у меня это Objective Caml version 3.00, и ожидание ввода команд:#.<br/>
Каждая логическая единица кода — фраза, заканчивается в Objective Caml — ;; Выход из интерпретатора, осуществляется либо по нажатию Сtrl+D, либо после вызова функции exit типа int -&gt; int:<br/>
<b>exit 0;;</b><br/>
 <a href="https://habr.com/ru/articles/74574/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=74574#habracut">Продолжение</a>]]></description>
      
      <pubDate>Sat, 07 Nov 2009 14:36:37 GMT</pubDate>
      <dc:creator><![CDATA[SHK]]></dc:creator>
      <category><![CDATA[Чулан]]></category>
      <category><![CDATA[ocaml]]></category><category><![CDATA[ФП]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Цепной квайн]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/74827/</guid>
      <link>https://habr.com/ru/articles/74827/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=74827</link>
      <description><![CDATA[Один японец написал забавный цепной квай.<br/>
<a href="http://ru.wikipedia.org/wiki/Куайн_%28программирование%29">Что такое квайн?</a>.<br/>
<br/>
 <a href="https://habr.com/ru/articles/74827/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=74827#habracut">посмотреть,что он написал</a>]]></description>
      
      <pubDate>Tue, 10 Nov 2009 12:39:24 GMT</pubDate>
      <dc:creator><![CDATA[icCE]]></dc:creator>
      <category><![CDATA[Ненормальное программирование]]></category>
      <category><![CDATA[ruby]]></category><category><![CDATA[python]]></category><category><![CDATA[perl]]></category><category><![CDATA[lua]]></category><category><![CDATA[ocaml]]></category><category><![CDATA[haskell]]></category><category><![CDATA[java]]></category><category><![CDATA[brainfuck]]></category><category><![CDATA[whitespace]]></category><category><![CDATA[unlambda]]></category><category><![CDATA[quine]]></category>
    </item>
  

  

  

	
  

  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Введение в OCaml: The Basics [1]]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/108529/</guid>
      <link>https://habr.com/ru/articles/108529/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=108529</link>
      <description><![CDATA[(предисловие от переводчика: сел учить окамл, обнаружил, что отсутствует перевод на русский язык руководства для начинающих. Восполняю этот пробел).<br/>
<br/>
<h1>Основы</h1><br/>
<h2>Комментарии</h2><br/>
Комментарии в OCaml обозначаются символами (* и *), примерно так:<br/>
<code>(* Это однострочный комментарий *)</code><br/>
<br/>
<pre>
(* Это комментарий
   на несколько
   строк.
*)
</pre><br/>
Другими словами, комментарии в OCaml очень похожи на комментарии в Си (<code>/* ... */</code>).<br/>
<br/>
В настоящий момент нет однострочных комментариев (как <code>#...</code> в Перле или <code>// ...</code> в C99/C++/Java). Когда-то обсуждалась возможность использовать <code>## ...</code>, и я весьма рекомендую окамловским товарищам в будущем добавить эту возможность (однако, хорошие редакторы открывают возможность использования однострочных комментариев даже сейчас).<br/>
<br/>
Комментарии в OCaml вложенные, это позволяет очень просто комментировать куски кода с комментариями:<br/>
<code>(* This code is broken ...<br/>
<br/>
(* Primality test. *)<br/>
let is_prime n =<br/>
(* note to self: ask about this on the mailing lists *) XXX;;<br/>
<br/>
*)<br/>
</code><br/>
<h2>Вызов функций</h2><br/>
Допустим, вы написали функцию, назовём её repeated, которая берёт исходную строку s, число n и возвращает новую строку, состоящую из n раз повторённой строки s.<br/>
<br/>
В большинстве С-подобных языков вызов функции будет выглядеть так:<br/>
<code>repeated (&quot;hello&quot;, 3) /* this is C code */</code><br/>
<br/>
Это означает «вызвать функцию repeated с двумя аргументами, первый аргумент — строка hello, второй аргумент — число 3».<br/>
<br/>
Подобно остальным функциональным языкам программирования, в OCaml, запись вызовов функций и использование скобок существенно отличается, что приводит к множеству ошибок. Вот пример того же самого вызова, записанного на OCaml: <code>repeated &quot;hello&quot; 3 (* this is OCaml code *)</code>.<br/>
<br/>
Обратите внимание — нет скобок, нет запятых между аргументами.<br/>
 <a href="https://habr.com/ru/articles/108529/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=108529#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Sun, 21 Nov 2010 03:29:05 GMT</pubDate>
      <dc:creator><![CDATA[amarao]]></dc:creator>
      <category><![CDATA[Программирование]]></category>
      <category>ocaml</category><category>функциональное программирование</category><category>перевод с английского</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Введение в OCaml: Структура программ на OCaml [2]]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/108532/</guid>
      <link>https://habr.com/ru/articles/108532/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=108532</link>
      <description><![CDATA[[прим. пер.: продолжение перевода, первая статья <a href="http://habrahabr.ru/blogs/programming/108529">тут</a>]<br/>
<img src="https://habrastorage.org/getpro/habr/post_images/923/f9c/3a3/923f9c3a37d9a2263615e60b69ed03c8.png" alt="тизер к статье с графикой на OCaml" align="right"/><br/>
<h1>Структура программ на OCaml</h1><br/>
Теперь мы потратим немного времени на высокоуровневый анализ некоторых настоящих программ на OCaml'е. Я хотел бы показать вам локальные и глобальные определения, разницу в использовании <nobr><code>;;</code> и <code>;</code></nobr>, модули, вложенные функции, ссылки. Из-за этого мы столкнёмся с множеством концепций OCaml'а, которые пока что не имеют смысла для начинающего изучать OCaml, так как мы не встречали их ранее. Не фокусируйтесь на них, сконцентрируйтесь вместо этого на общем представлении о формате программ и особенностях языка, на которые я буду указывать.<br/>
<br/>
<h2>Локальные «переменные» (на самом деле локальные выражения)</h2><br/>
Возьмём нашу функцию <code>average</code> на Си и добавим в неё локальные переменные (сравните её с примером в прошлой главе).<br/>
<br/>
<pre>
double average (double a, double b)
{
  double sum = a + b;
  return sum / 2;
}
</pre><br/>
Теперь посмотрим на это для OCaml:<br/>
<br/>
<pre>
let average a b =
  let sum = a +. b in
  sum /. 2.0;;
</pre><br/>
Стандартное выражение <code>let name = expression in</code> используется для определения локального именованного выражения и <code>name</code> может быть использовано в дальнейшем вместо expression вплоть до <code>;;</code>, который означает окончание локального блока кода. Обратите внимание, мы даже не использовали отступ после объявления <code>in</code>. Просто воспринимайте <code>let ... in</code> так, как будто это один оператор.<br/>
 <a href="https://habr.com/ru/articles/108532/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=108532#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 26 Nov 2010 01:55:20 GMT</pubDate>
      <dc:creator><![CDATA[amarao]]></dc:creator>
      <category><![CDATA[Программирование]]></category>
      <category>ocaml</category><category>функциональное программирование</category><category>перевод с английского</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Введение в OCaml: Типы данных и сопоставление [3]]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/108920/</guid>
      <link>https://habr.com/ru/articles/108920/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=108920</link>
      <description><![CDATA[[прим. пер.: продолжение перевода. <a href="http://habrahabr.ru/blogs/programming/108529">первая часть</a>, <a href="http://habrahabr.ru/blogs/programming/108532">вторая часть</a>]<br/>
<br/>
<h2>Связные списки</h2><br/>
В OCaml, так же как в Perl, есть встроенная на уровне языка поддержка списков. Все элементы списка должны быть одного типа. Для определения типа используется выражение:<br/>
<br/>
<pre>
[1; 2; 3]
</pre><br/>
Обратите внимание: точка с запятой, а не запятая.<br/>
<br/>
<code>[]</code> означает пустой список.<br/>
<br/>
У списка есть <b>голова</b> (первый элемент) и <b>хвост</b> (остальные элементы, кроме головы). Голова — элемент. Хвост — список. В вышеприведённом примере голова — целое число 1, а хвост — список <code>[2; 3]</code>.<br/>
<br/>
Альтернативной формой записи является использование оператора <b>конструирования</b> (cons) в форме <code>head :: tail</code>. Нижеприведённые строки полностью эквивалентны друг другу.<br/>
<br/>
<pre>
[1; 2; 3]
1 :: [2; 3]
1 :: 2 :: [3]
1 :: 2 :: 3 :: []
</pre><br/>
Зачем мы упомянули оператор конструирования? Он полезен когда мы начинаем сопоставление с образцом для списков, мы обсудим это чуть позже.<br/>
<br/>
<h2>Тип данных для связного списка</h2><br/>
Тип данных для связного списка целых будет <code>int list</code>; общий тип для связного списка объектов типа <code>foo</code> будет <code>foo list</code>. <br/>
 <a href="https://habr.com/ru/articles/108920/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=108920#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Sat, 04 Dec 2010 23:21:38 GMT</pubDate>
      <dc:creator><![CDATA[amarao]]></dc:creator>
      <category><![CDATA[Программирование]]></category>
      <category>ocaml</category><category>функциональное программирование</category><category>перевод с английского</category>
    </item>
  

  

    
    <item>
      <title><![CDATA[OCaml и PHP — эзотерика для вашего удобства]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/98185/</guid>
      <link>https://habr.com/ru/articles/98185/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=98185</link>
      <description><![CDATA[<b>NB:</b> читая этот топик, желательно не есть — можно поперхнуться от неожиданности.<br/>
<b>NB:</b> менее ценные куски кода пришлось вынести на пастебин, из-за того что хабр обрезает пост. Следите за ссылками в тексте.<br/>
<br/>
Многие причисляют OCaml к маргинальным и даже эзотерическим языкам. Возможно они и правы, хотя множество людей с ними не согласны. Для меня знакомство с ним началось с полгода назад, когда мне в очередной раз захотелось научиться чему-то новому и я подумал, что хоть один функциональный язык надо освоить. Из множества языков я выбрал Objective Caml. Язык покорил меня человеческим синтаксисом и идеей: есть все функциональные радости жизни, но если хочешь императивный стиль и ООП — бери, их есть у меня! Оказалось, что разработчики прекрасно понимали, что для разных задач нужны разные средства. Три дня чтения <a href="http://www.ocaml-tutorial.org/">мануала для C++ и Perl-программистов</a> и я уже вполне мог читать код и писать хеллоуворлды. На этом моё знакомство с языком закончилось, потому что изучать язык не на реальной задаче — дело глупое.<br/>
 <a href="https://habr.com/ru/articles/98185/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=98185#habracut">А теперь о более реальной разработке</a>]]></description>
      
      <pubDate>Tue, 13 Jul 2010 16:37:31 GMT</pubDate>
      <dc:creator><![CDATA[torkve]]></dc:creator>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[ocaml]]></category><category><![CDATA[php]]></category><category><![CDATA[php5]]></category><category><![CDATA[php extenstion]]></category><category><![CDATA[c]]></category><category><![CDATA[c++]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Ocsigen 2.0 — новая версия фреймворка для OCaml]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/128952/</guid>
      <link>https://habr.com/ru/articles/128952/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=128952</link>
      <description><![CDATA[Для тех, кто не знает: строго говоря, Ocsigen — это не совсем фреймворк. Ocsigen — это набор инструментов для создания эффективных веб-приложений на языке OCaml, он включает в себя как веб-сервер, так и инструменты для работы с потоками, написания расширений к веб-серверу, генерации HTML и многого другого. Кстати, замечу, что это может показаться невероятным (а кому-то может и не очень удобным), но генерируемый HTML5 или XHTML является статически типизированным, и валидность всего, что ваш сайт может сгенерить, будет проверена ещё на этапе компиляции.<br/>
<img src="https://habrastorage.org/storage1/bc6c1451/86527410/582797c3/9dfee108.png"/><br/>
Картинка для привлечения внимания — вращающаяся земля целиком написана на OCaml, а работает целиком в браузере.<br/>
Ну а вчера вышла новая версия этого замечательного фреймворка, и вот информация из анонса Винсента Балата (Vincent Balat): <a href="https://habr.com/ru/articles/128952/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=128952#habracut">Прочитать о ней</a>]]></description>
      
      <pubDate>Thu, 22 Sep 2011 10:50:11 GMT</pubDate>
      <dc:creator><![CDATA[torkve]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[ocaml]]></category><category><![CDATA[ocsigen]]></category><category><![CDATA[js_of_ocaml]]></category><category><![CDATA[lwt]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Динамические приложения с Ocsigen или Йоба возвращается]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/129109/</guid>
      <link>https://habr.com/ru/articles/129109/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=129109</link>
      <description><![CDATA[Что делает холодным воскресным утром нормальный человек? Любой вам ответит: холодным воскресным утром человек спит. Потому что всю неделю он работал и хочет отдохнуть.<br/>
Что делает холодным воскресным утром программист? Холодным воскресным утром программист пьёт горячий чай и пишет код. Чай он пьёт, потому что утро холодное, да и проснулся ещё не до конца, а код пишет, потому что хочется. Программисту всегда хочется писать код, только в будни он пишет код за деньги и от этого очень устаёт, а в выходные для себя, поэтому отдыхает.<br/>
<br/>
Этим утром мы будем писать наше первое приложение для Ocsigen. Желающим неплохо бы сначала ознакомиться с <a href="http://ocsigen.org/tutorial/intro">официальным мануалом</a>, впрочем, на многое надеяться не стоит, потому что мануал недописан, пестрит недоуменными строками а-ля &quot;??????&quot; и нецензурной речью на французском. Поэтому основным мануалом буду я.<br/>
<br/>
Как вы возможно помните, когда-то мы <a href="http://habrahabr.ru/blogs/compilers/116301/">писали</a> интерпретатор языка Йоба. С тех пор интерпретатор был незначительно улучшен, выделен в отдельный класс, стал принимать строку на вход, отдавать строку на выход (вместо работы с консолью). Теперь нашей задачей станет <s>внедрение Йобы в качестве основного языка компании Google</s> превращение интерпретатора Йобы в веб-приложение, да не простое — а клиентское. Хоть я и добавил в класс счётчик операций, чтобы нельзя было слишком обнаглеть, но всё равно — пусть пользователь на своём компьютере вычислительные мощности тратит, а не на сервере.<br/>
 <a href="https://habr.com/ru/articles/129109/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=129109#habracut">Поехали!</a>]]></description>
      
      <pubDate>Sun, 25 Sep 2011 11:07:09 GMT</pubDate>
      <dc:creator><![CDATA[torkve]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[ocaml]]></category><category><![CDATA[ocsigen]]></category><category><![CDATA[eliom]]></category><category><![CDATA[lwt]]></category><category><![CDATA[js_of_ocaml]]></category><category><![CDATA[йоба]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Melange — DSL для сетевых протоколов]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/207764/</guid>
      <link>https://habr.com/ru/articles/207764/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=207764</link>
      <description><![CDATA[<img align="right" src="https://habrastorage.org/getpro/habr/post_images/694/788/f84/694788f8487decb436713dfcf14518da.png"/>Всем программистам рано или поздно приходится передавать данные. Ни для кого не секрет, что библиотек сериализации в Java существует примерно &gt;9000, а в C++ они вроде и есть, а вроде их и нет. К счастью для большинства, несколько лет назад появился Google Protobuf, который принёс достаточно удобный способ определять структуры данных и быстро завоевал всенародную любовь. Это была фактически первая, доступная широким массам библиотека, позволяющая гонять по сети готовые структуры данных, не связываясь при этом с чем-то вроде XML. На дворе был 2008 год.<br/>
<br/>
Вернёмся немного назад. В 2006 году простой индийский программист (как бы подозрительно это ни звучало!) Анил Мадхавапедди, один из самых известных сейчас в мире OCaml-разработчиков и автор свежевышедшей книги <a href="http://realworldocaml.org/">Real World OCaml</a>, защищал в Кембридже <a href="http://www.cl.cam.ac.uk/techreports/UCAM-CL-TR-775.pdf">кандидатскую диссертацию</a>. Именно о ней я сегодня вам и расскажу.<br/>
<br/>
Анил сразу пошёл дальше, чем Google. Он сразу подумал, для чего люди обычно пересылают по сети какие-то формализованные структуры данных? Чтобы реализовать какой-то протокол. А что такое протокол? Это какой-то <a href="http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82">конечный автомат</a>. А где мы можем взять хороший пример сложного, хорошо спроектированного и проверенного временем протокола? Да прямо в обычном сетевом стеке! Итак, были взяты набор сетевых структур данных и протоколов: Ethernet frame, IPv4, ICMP, TCP, UDP, SSH, DNS и DHCP и постановка задачи: большая часть этих протоколов (особенно SSH и DNS) реализуются, что называется «руками», а хочется, чтобы не было типичных для C переполнений буфера, все переходы совершались автоматически, это всё можно было верифицировать, и чтобы работало быстро, а не как обычно.<br/>
<br/>
Поскольку никто не будет читать диссертацию, сразу скажу: это более чем удалось. По результатам работы были написаны референсные реализации DNS и SSH-сервера и произведено сравнение с BIND и OpenSSH. OCaml-реализации давали по сравнению с традиционными прирост производительности от незначительного, до почти двухкратного. Кроме того была найдена ошибка в RFC на SSH (рабочая группа была уведомлена и RFC исправлен). О том, что было сделано, и как с этим жить, читайте под катом.  <a href="https://habr.com/ru/articles/207764/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=207764#habracut">Мне интересно.</a>]]></description>
      
      <pubDate>Sat, 28 Dec 2013 20:07:01 GMT</pubDate>
      <dc:creator><![CDATA[torkve]]></dc:creator>
      <category><![CDATA[Ненормальное программирование]]></category><category><![CDATA[Qt]]></category><category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[qt]]></category><category><![CDATA[qt quick]]></category><category><![CDATA[ocaml]]></category><category><![CDATA[melange]]></category><category><![CDATA[mpl]]></category><category><![CDATA[spl]]></category><category><![CDATA[сетевые протоколы]]></category><category><![CDATA[сериализация]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Как сделать Laser Squad из XCOM: этюд для GDB в OSX]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/255787/</guid>
      <link>https://habr.com/ru/articles/255787/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=255787</link>
      <description><![CDATA[<img src="https://habrastorage.org/files/233/50d/817/23350d817fa54273ac4513758a1d73ef.jpg" alt="image"/><br/>
<br/>
Вот так теперь выглядит игра Laser Squad, которую я увидел очень давно. Тогда она была во всех смыслах проще и выглядела так:<br/>
<br/>
<img src="https://habrastorage.org/files/805/8f3/03a/8058f303aae14a938528d4a48ca91f49.png" alt="image"/><br/>
<br/>
При этом принципиально игра не изменилась. Просто стала сложнее: куча типов ресурсов, множество вариантов их применения плюс «инфляция»: каждая следующая мастерская, лаборатория или спутниковый канал стоят больше, чем предыдущие. С одной стороны, это все дает возможность играть разными стратегиями развития, но иногда так хочется поиграть просто в Laser Squad! Поэтому…<br/>
 <a href="https://habr.com/ru/articles/255787/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=255787#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 15 Apr 2015 07:57:11 GMT</pubDate>
      <dc:creator><![CDATA[zbroyar]]></dc:creator>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[os x]]></category><category><![CDATA[gdb]]></category><category><![CDATA[ocaml]]></category><category><![CDATA[XCOM: Enemy Unknown]]></category><category><![CDATA[перевод]]></category>
    </item>
  

  

  

	
  

  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Десять причин не использовать статически типизированный функциональный язык программирования]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/190492/</guid>
      <link>https://habr.com/ru/articles/190492/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=190492</link>
      <description><![CDATA[<blockquote>От переводчика<br/>
Это вольный перевод статьи о том, почему люди боятся функциональных языков, присутствует ирония и юмор, для тех кто может и любит читать на английском <a href="http://fsharpforfunandprofit.com/posts/ten-reasons-not-to-use-a-functional-programming-language/">оригинал здесь</a>.<br/>
<br/>
<h6>Про автора</h6><br/>
Я разработчик и архитектор британской не софтверной компании. Имею 20 летний опыт в различных областях от высоко-уровневых UX/HCI до низко-уровневых реализаций баз данных.<br/>
Несмотря на то что я использую C# в своей повседневной работе, я писал промышленный код на многих языках, мои любимые Smalltalk, Python и совсем недавно F# (поэтому я и создал <a href="http://fsharpforfunandprofit.com/">этот сайт</a>).<br/>
</blockquote><br/>
<br/>
<h4>Разглагольствования по поводу того чего я не понимаю</h4><br/>
Вам надоела вся эта шумиха вокруг функциональных языков? Мне тоже! Я выскажу по этому поводу несколько причин почему разумные люди, такие как мы с вами, должны держаться подальше от этого.<br/>
<br/>
Немного поясню: когда я говорю «статически типизированный функциональный язык программирования», я подразумеваю языки, которые поддерживают вывод типов по-умолчанию и прочее. На практике это означает Haskell и семейство языков ML (включая OCaml и F#).<br/>
 <a href="https://habr.com/ru/articles/190492/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=190492#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Sun, 18 Aug 2013 19:13:31 GMT</pubDate>
      <dc:creator><![CDATA[DarkCoder]]></dc:creator>
      <category><![CDATA[Функциональное программирование]]></category>
      <category>функциональное программирование</category><category>f#</category><category>haskell</category><category>ocaml</category><category>ml</category><category>c#</category>
    </item>
  

  

    
    <item>
      <title><![CDATA[Скоро ICFPC 2016]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/306882/</guid>
      <link>https://habr.com/ru/articles/306882/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=306882</link>
      <description><![CDATA[19 серия культового соревнования начнётся в пятницу, 5 августа, в 0:00 UTC.<br/>
<br/>
<blockquote>ICFP Programming Contest — международное соревнование по программированию, проводимое ежегодно летом с 1998 года. Результаты соревнования объявляются на Международной конференции по функциональному программированию. (с) <a href="https://ru.wikipedia.org/wiki/ICFP_Programming_Contest">Wikipedia</a></blockquote><br/>
 <a href="https://habr.com/ru/articles/306882/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=306882#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 02 Aug 2016 02:26:01 GMT</pubDate>
      <dc:creator><![CDATA[unclechu]]></dc:creator>
      <category><![CDATA[Haskell]]></category><category><![CDATA[Спортивное программирование]]></category><category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[функциональное программирование]]></category><category><![CDATA[соревнования по программированию]]></category><category><![CDATA[haskell]]></category><category><![CDATA[ocaml]]></category><category><![CDATA[lisp]]></category>
    </item>
  

  

  

	
  

  

  

      

      

      

    
  </channel>
</rss>
