суббота, 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 комментариев:

Andrey Rybin комментирует...

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

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


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

http://clojure.org/


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

Pavel Samolisov комментирует...

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

catlion комментирует...

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

fixxer комментирует...

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

qboriskr комментирует...

Я нуб в .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("")
;;

Pavel Samolisov комментирует...

Вероятно потому-что у вас не установлен PowerPack.

le-greem комментирует...

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

Pavel Samolisov комментирует...

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

le-greem комментирует...

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

le-greem комментирует...

Все разобрался. Получилось что говориться от противного...
Делаем сначала
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/

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

Отправить комментарий

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