суббота, 20 февраля 2010 г.

Устанавливаем F# и FSharp.PowerPack под Mono


Суровому челябинскому программисту захотелось экзотики. А что у нас является экзотикой? Правильно - продукция маленькой и незаметной компании из Redmond'а. В частности - ее платформа .NET и набирающий популярность функциональный язык программирования F#. Вот об установке этого чуда под Mono - открытую реализацию CLR под *nix подобные ОС мы и поговорим.

Прежде всего следует установить сам Mono, причем версии 2.0 или выше. В дереве портежей сейчас присутствует версия 2.4.2.3, которая легко устанавливается следующей командой:

pavel> sudo emerge mono

Теперь нам нужно скачать последний Community Technology Review (CTP) языка F# по ссылке Download the F# CTP, расположенной на странице (как я понял для каждого нового CTP ссылка на него меняется, в частности февральский можно скачать отсюда). Не забываем, что скачивать нужно ZIP-архив.


После того, как архив скачается его нужно распаковать в директорию, в которой вы хотите, чтобы у вас был установлен F#. Я распаковал в /opt/fsharp. В данной директории находится файл install-mono.sh. Необходимо назначить ему права на исполнение:

pavel> chmod +x install-mono.sh

Теперь нужно решить такую проблему: инсталятор F# захочет переподписать сборку FSharp.Core.dll с помощью файла mono.snk (инкапсулирующего в себе ключи). Чтобы он смог это сделать - необходимо скачать данный файл по адресу http://anonsvn.mono-project.com/source/trunk/mcs/class/mono.snk и поместить в корень каталога, в который вы распаковали F#.

Далее следует выполнить скрипт install-mono.sh, который переподписывает сборку и регистрирует ее в GAC mono.

Рекомендую добавить в .bashrc алиасы для вызова интерпретатора и компилятора F#:


alias fsi="mono /opt/fsharp/bin/fsi.exe"
alias fsc="mono /opt/fsharp/bin/fsc.exe"


В принципе, теперь F# установлен и можно писать на нем программы (для этого следует настроить любимую IDE, что не является темой нашего сегодняшнего разговора). Однако существенно расширить его возможности можно, установив PowerPack - набор мощных библиотек математических функций, функций работы с метаинформацией и Linq, так же включающий в себя такие утилиты, как fshtmldoc, fslexx и fsyacc.

Данный набор библиотек и утилит разрабатывается сообществом и расположен на сайте CodePlex. Февральский релиз можно скачать отсюда (опять же качать следует zip-архив). Здесь есть одна сложность: архив криво распаковывается под Linux - теряется информация о путях файлов, т.е. вместо того, чтобы после распаковки создалась структура файлов и каталогов - создается набор файлов с именами вида FSharp.PowerPack\bin\FSharp.PowerPack.dll. Я создал свой архив с шахматами и поэтессами, в котором разложил файлы по каталогам, а так же написал инсталятор install-mono-powerpack.sh.

После скачивания необходимо распаковать архив в каталог, в котором расположен F# и выполнить скрипт install-mono-powerpack.sh, который зарегистрирует в GAC сборку FSharp.PowerPack.dll и назначит правильные права на утилиты.

Давайте теперь скомпилируем и выполним какой-нибудь пример, демонстрирующий использование F# и PowerPack. Возьмем программу, предложенную Дмитрием Сошниковым в хабратопике Влюбляемся в F#: Доза 2: Строим фрактальное изображение или множество Мандельброта своими руками.

Вот так будет выглядеть фрактал, построенный в консоли с помощью символов "*":



А вот так - то же самое, но в графическом виде (не все знают, что Mono поддерживает WinForms)



Как видим - все работает, в том числе и библиотека работы с комплексными числами из PowerPack.

Теперь расскажу где можно найти информацию по языку F# и его применению:

1. Презентация на Channel 9 - An Introduction To Microsoft F#.

2. Книги Learn F# и Expert F#

3. Видео-презентация F# на Платформа-онлайн 2010 от Дмитрия Сошникова - академического евангелиста Microsoft.

4. ИНТУИТ. Видеокурс Функциональное программирование - в целом курс посвящен не столько F#, сколько функциональному программированию вообще, но примеры в нем даются на F#. Читает курс Дмитрий Сошников - академический евангелист Microsoft.

5. Блог Дона Сайма - одного из основных разработчиков F#.

6. F# News - блог с последними актуальными новостями из мира F#

7. Inside F# - очень хороший блог, автор которого много пишет про различные аспекты применения F# на практике.

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter

10 комментариев:

  1. Похожий язык (ex: OOP->OOP) можно изучить за несколько дней.
    Сменить мышление (OOP->функциональный) дольше.
    Но что по настоящему привязывает вас - это API, библиотеки.

    Например, Java после Delphi училась быстро и приятно, но реально смог работать сильно после того как "знал" язык.


    Т.е. если хотелось необычного, может стоило изучить (и рассказать нам) хит последних месяцев:

    http://clojure.org/


    Внутри кошерной JVM.
    Если затошнило от ФП всегда можно вернуться к кошерной Java, Groovy, etc.

    ОтветитьУдалить
  2. Алекс Отт обещал большое введение в clojure в новом выпуске "Практики функционального программирования". А вообще хочу попробовать написать OSGi-бандл на clojure.

    ОтветитьУдалить
  3. Спасибо, про видеокурс не знал. Добью SICP, ознакомлюсь.

    ОтветитьУдалить
  4. столкнулся с проблемой.
    ставил F# 2.0 под Mono и не могу подписать PowerPack с помощью mono.snk. И на самом деле, публичные ключи в Core.dll и PowerPack.dll отличаются. Кто-нибудь сталкивался?

    ОтветитьУдалить
  5. Я нуб в .Net а тем более F#.
    Подскажите, почему в Моне не находит Complex, хотя в Windows работает?

    Microsoft (R) F# 2.0 Compiler build 2.0.0.0
    Copyright (c) Microsoft Corporation. All Rights Reserved.

    /mnt/hgfs/work/mono/mandel.fs(5,16): error FS0039: The type 'Complex' is not defined

    /mnt/hgfs/work/mono/mandel.fs(5,28): error FS0039: The type 'Complex' is not defined

    /mnt/hgfs/work/mono/mandel.fs(11,18): error FS0039: The namespace or module 'Complex' is not defined

    /mnt/hgfs/work/mono/mandel.fs(17,12): error FS0039: The value or constructor 'Complex' is not defined

    Хотя в Винде всё ок.

    код:
    open Microsoft.FSharp.Math
    open System.Numerics
    open System

    let mandelf (c:Complex) (z:Complex) = z*z+c;;

    let rec rpt n f =
    if n=0 then (fun x->x)
    else f >> (rpt (n-1) f);;

    let ismandel c = Complex.Abs(rpt 20 (mandelf c) (Complex.Zero))<1.0;;

    let scale (x:float,y:float) (u,v) n = float(n-u)/float(v-u)*(y-x)+x;;
    for i = 1 to 60 do
    for j = 1 to 60 do
    let lscale = scale (-1.2,1.2) (1,60) in
    let t = Complex ((lscale j) , (lscale i)) in
    System.Console.Write(if ismandel t then "*" else " ");
    System.Console.WriteLine("")
    ;;

    ОтветитьУдалить
  6. Вероятно потому-что у вас не установлен PowerPack.

    ОтветитьУдалить
  7. Не могли бы вы перезалить куда-нибудь ваш архив с FSharp.PowerPack. Ссылка на депозиты битая. Заранее благодарен.

    ОтветитьУдалить
  8. К сожалению у меня не осталось данного архива.

    ОтветитьУдалить
  9. Очень жаль... Уже кучу времени потерял на установку FSharp.PowerPack и плагина для F# к monodevelop. Не нашел нигде, чтобы внятно было написано куда какие библиотеки складывать. Не видит fsi искомую dll-ку и все тут... Понятно что обычная распаковка как во всех инструкциях не работает. Вы не помните хотя бы примерно что где может находиться?

    ОтветитьУдалить
  10. Все разобрался. Получилось что говориться от противного...
    Делаем сначала
    7. Test your installation as a normal user (not root)

    ~> fsi
    Microsoft (R) F# 2.0 Interactive build 2.0.0.0
    Copyright (c) Microsoft Corporation. All Rights Reserved.

    For help type #help;;
    > #r "FSharp.PowerPack.dll";;

    и видим что то вроде:
    /usr/lib/mono/gac/Mono.Addins.Setup/stdin(1,1): error FS0078: Unable to find the file 'FSharp.PowerPack.dll' in any of
    /usr/lib/mono/4.0
    /usr/lib/mono/gac/Mono.Addins.Setup
    /usr/lib/mono/4.0/

    Вот в одну из этих директорий и копируем нужные файлы. После этого проблем с видимостью длл интерпретатором не возникало. Может кому полезно будет.

    ОтветитьУдалить

Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!