Суровому челябинскому программисту захотелось экзотики. А что у нас является экзотикой? Правильно - продукция маленькой и незаметной компании из 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. Я создал свой архив
После скачивания необходимо распаковать архив в каталог, в котором расположен 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

6 комментариев:
Похожий язык (ex: OOP->OOP) можно изучить за несколько дней.
Сменить мышление (OOP->функциональный) дольше.
Но что по настоящему привязывает вас - это API, библиотеки.
Например, Java после Delphi училась быстро и приятно, но реально смог работать сильно после того как "знал" язык.
Т.е. если хотелось необычного, может стоило изучить (и рассказать нам) хит последних месяцев:
http://clojure.org/
Внутри кошерной JVM.
Если затошнило от ФП всегда можно вернуться к кошерной Java, Groovy, etc.
Алекс Отт обещал большое введение в clojure в новом выпуске "Практики функционального программирования". А вообще хочу попробовать написать OSGi-бандл на clojure.
Спасибо, про видеокурс не знал. Добью SICP, ознакомлюсь.
столкнулся с проблемой.
ставил F# 2.0 под Mono и не могу подписать PowerPack с помощью mono.snk. И на самом деле, публичные ключи в Core.dll и PowerPack.dll отличаются. Кто-нибудь сталкивался?
Я нуб в .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("")
;;
Вероятно потому-что у вас не установлен PowerPack.
Отправить комментарий
Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!