?

Log in

No account? Create an account
Stranger in a strange land: привычки от Haskell в стране OCaml - Лямбда - функциональное программирование [entries|archive|friends|userinfo]
Лямбда - функциональное программирование

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Stranger in a strange land: привычки от Haskell в стране OCaml [Dec. 23rd, 2010|01:59 pm]
Лямбда - функциональное программирование

ru_lambda

[_adept_]
[Tags|, ]

Я тут подумал, что с тех пор, как я читал книжку про OCaml и пытался что-то на нем писать, прошло уже прилично лет, и можно было бы попробовать сделать из себя "окамло-читателя" какого-никакого "окамло-писателя". Пост, конечно, слегка офф-топик, но я решил, что напишу его именно сюда, чтобы была возможность не объяснять привычки и идиомы "из Haskell" и рассчитывать, что читатели меня поймут.

Итак, я взял какой-то игрушечный пример и попробовал переписать его с Haskell на OCaml, используя http://caml.inria.fr/pub/docs/manual-ocaml/libref/ в качестве справочника. В первые же пять минут мне пришлось самому написать dropWhile и takeWhile. . Кроме того мне понадобился аналог zipWith, который не кидается exception-ами, если ему дали списки разной длины (я ж правильно понимаю, что нет возможности перехватить такое исключение и сказать "обработали, что есть, и довольно"?). Ну и еще 2-3-10 велосипедов разной степени велосипедности.

Я в такой ситуации всегда склонен считать, что это я дурак, и не знаю, за какой конец брать правильные инструменты. Не могли бы благородные доны, знающие и Haskell, и OCaml, подсказать мне:

1)Есть ли аналог :browse и :info в ghci, чтобы порыться в доступных библиотеках, не зная названий нужных тебе модулей и функций?
Что советуют: module Asd = List ;; вывалит интерфейс модуля. Еще можно смотреть глазами в .mli. Еще есть ocamlbrowser.

2)Что используется вместо cabal build? Ocamlfind или что-то другое? Есть ли возможность при интерактивной разработке не делать #load "str.cma" руками?
Что советуют: oasis, ocamlfind, GODI. Для ocaml toplevel можно написать init-скрипт. Или сделать custom toplevel.

3)Есть ли аналог hoogle? Как вообще решаются задачи "пойди туда, не знаю, куда, и найди функции, которая по предикату и списку дают другой список?"
Что советуют: ничего

4)Что есть аналогом hackage?
Что советуют: oasis-db. Еще смотреть на http://caml.inria.fr//cgi-bin/hump.en.cgi

5)Где живут библиотеки для работы со списками и прочими "базовыми" структурами данных, более богатые, чем стандартные?
Что советуют: extlib, janest-core, batteries

6)Как называются must-know инструменты (анало для haskell: ghc, cabal, threadscope, haddock, ...)?
Что советуют: menhir, camlp4

UPD: повписывал в пост текущие советы из других источников.
linkReply

Comments:
[User Picture]From: lionet
2010-12-23 12:19 pm (UTC)
Стадия номер $N+2: Смирение с судьбой.
(Reply) (Thread)
[User Picture]From: potan
2010-12-23 12:34 pm (UTC)
1) Есть отдельная программа bcamlbroser и библиотека findlib.
2) Godi.
5) В модуле List что-то есть.
(Reply) (Thread)
[User Picture]From: _adept_
2010-12-24 08:05 am (UTC)
А для пункта (1) есть что-то подобное ":info"? Чтобы, глядя на код с кучей "open"-ов, быстро понять, откуда втащился тот или иной символ.
(Reply) (Parent) (Thread)
[User Picture]From: little_arhat
2010-12-23 12:40 pm (UTC)
1) workaround для `:browse`: в топлевеле module X = ModuleName -- будет напечатано сигнатура модуля.
2) http://oasis.forge.ocamlcore.org/index.php . для "не делать руками" -- ocamlfind:


# #use "topfind";;

- : unit = ()
Findlib has been successfully loaded. Additional directives:
#require "package";; to load a package
#list;; to list the available packages
#camlp4o;; to load camlp4 (standard syntax)
#camlp4r;; to load camlp4 (revised syntax)
#predicates "p,q,...";; to set these predicates
Topfind.reset();; to force that packages will be reloaded
#thread;; to enable threads

- : unit = ()

# #require "str";;
/home/user/kamlo/lib/ocaml: added to search path
/home/user/kamlo/lib/ocaml/str.cma: loaded

3) что-то вроде хугла http://docs.camlcity.org/docs/index.html . как правило, спасают сгенерированным ocamldoc'ом справочные страницы (вроде такой: http://camlunity.ru/camlp4-3.12/ )

Для расширения стандартной библиотеки обязательно нужно поставить одно из:
http://code.google.com/p/ocaml-extlib/
http://batteries.forge.ocamlcore.org/
http://ocaml.janestreet.com/?q=node/13 ( Janestreat core)
я последнее не пробовал, extlib'а хватает, батарейки -- еще больше.
(Reply) (Thread)
From: blog.mykola.org
2010-12-24 03:25 am (UTC)

Вопрос

А вот почему именно _обязательно_ нужно поставить тот-же extlib? Что в нем такого критичного, чего нет в базовой библиотеке?
(Reply) (Parent) (Thread) (Expand)
[User Picture]From: _adept_
2010-12-24 08:06 am (UTC)
re (2): я правильно понимаю, что список модулей, предоставляемых конкретной библиотекой, таким образом узнать нелья, в т.ч. даже и загрузив саму библиотеку через #require?
(Reply) (Parent) (Thread)
(Deleted comment)
(Deleted comment)
[User Picture]From: ifp5
2010-12-23 02:33 pm (UTC)
А можно поинтересоваться смыслом сего действия?
(Reply) (Thread)
[User Picture]From: ifp5
2010-12-23 02:34 pm (UTC)
В смысле перехода с Haskell на OCaml.
(Reply) (Parent) (Thread) (Expand)
From: gds
2010-12-23 05:02 pm (UTC)
1. Есть ещё документация, поставляемая с нужной библиотекой.

2. ocamlbuild, если правильно понимаю, для build, и "#use "topfind";;" из findlib для топлевела.

3. ocamlbrowser, он умеет по типу искать функции. Однако не советую: хоть х-исты и говорят про "theorems for free" и прочую xyuty, на практике оказываются либо исключения из правил, либо переставленные аргументы, либо слишком много возможностей (тот же List.filter -- несмотря на тип, он может как включать то, что попадает под предикат, так и исключать это).

4. + http://forge.ocamlcore.org/

5. Зависит от того, что именно нужно. Есть и HashSet, и машинно-доказанные вещи типа Map, и библиотека для работы с тру-циклическими списками, и работа с s-выражениями (почти всем нужно, рано или поздно), и прочее.
(Reply) (Thread)
[User Picture]From: _adept_
2010-12-24 08:13 am (UTC)
Касательно (3): меня сейчас не интересуют theorems for free. Меня интересует "имя, сестра, имя!". Чтобы, значить, понять, как в ocaml-land зовется привычный мне zipWith или что-то другое, и не изобретать 101 велосипед.
(Reply) (Parent) (Thread) (Expand)
From: blog.mykola.org
2010-12-24 03:14 am (UTC)
Якщо ти володієш Haskell, то навіщо тобі OCaml? "Плюс одна мова" мені виглядає слабою мотивацією.
Я зробив OCaml своїм основним інструментом два роки тому і не можу сказати, що я його знаю: там ще опановувати і опановувати.

Нажаль, Haskell я не знаю зовсім, тому порівнювати не можу. Але:

1. $ less `ocamlfind -query `/*.mli. Це краще ніж toplevel, оскільки в коді коментарі.
2. Приєднуюсь до little_arhat: ocamlfind та його toplevel-директива #use "topfind" з подальшими #require. Для збірки проектів - старий добрий Makefile (можу поділитись прикладом)
3. Не знаю
4. Не знаю, що таке hackage
5. Ось тут мені цікаво, а чого тобі не вистачає у базовій бібліотеці? Може, я поганий програміст, але мене якось все задовільняє.
6. Тут залежить від задач. Те, що тобі вже нарекомендували, потрібно якщо ти постійно будуєш DSL'і та синтаксичні розширення. Я більше користуюсь конкретними бібліотеками: ocamlnet, cryptokit, lacaml, pcre. Останнім часом добре пішов atdgen (http://oss.wink.com/atdgen/atdgen-1.0.1/manual/atdgen-manual.html).
(Reply) (Thread)
[User Picture]From: _adept_
2010-12-24 08:17 am (UTC)
re. (2): а как посмотреть список модулей в библиотеке (из toplevel)?

re. (4): hackage.haskell.org + возможность поставить библиотеку одной командой (cabal install libname)

re. (5): Можно, например, сравнить стандартный окамловский модуль работы со списками и http://www.haskell.org/ghc/docs/7.0.1/html/libraries/base-4.3.0.0/Data-List.html. Да, большая часть функций пишется самостоятельно в 5-7 строк. Но я по опыту знаю, что потом эти 5-7 строк начинают кочевать за тобой из исходника в исходник, и постепенно ты поверх ocaml делаешь свою "базовую библиотеку".
(Reply) (Parent) (Thread) (Expand)
[User Picture]From: ktulthu
2010-12-28 04:08 am (UTC)
и всетаки она вертится (с)
(Reply) (Thread)
From: dmzlj
2011-01-10 08:38 am (UTC)

3)Есть ли аналог hoogle? Как вообще решаются задачи "пойди туда, не знаю, куда, и найди функции, которая по предикату и списку дают другой список?"
Что советуют: ничего


йохохо, а я вот этого не знал, и так мучался. а тут
hoogle 'String -> ByteString' | egrep 'ByteString$' и опа. Спасибо большое за хинт.

Edited at 2011-01-10 08:42 am (UTC)
(Reply) (Thread)