?

Log in

No account? Create an account
Stranger in a strange land: привычки от Haskell в стране OCaml - Лямбда - функциональное программирование — LiveJournal [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: _adept_
2010-12-24 08:13 am (UTC)
Касательно (3): меня сейчас не интересуют theorems for free. Меня интересует "имя, сестра, имя!". Чтобы, значить, понять, как в ocaml-land зовется привычный мне zipWith или что-то другое, и не изобретать 101 велосипед.
(Reply) (Parent) (Thread)
From: gds
2010-12-24 09:52 am (UTC)
тогда правильно посоветовали extlib и batteries, советую батарейки, там и больше, и поддерживаемо (багфиксы принимают на ура, в случае чего).

Кстати, у меня иногда бывает такой метод велосипедничества: кладу модули в файлы в стиле extlib'а -- extStream.ml, extString.ml, с таким содержимым:
module Stream =
  struct
    include Stream;

    (* дополнительные функции: *)
    value map : ('a -> 'b) -> t 'a -> t 'b;
    ...
  end;

И периодически таскаю из проекта в проект такие модули. Для использования делаю просто open ExtStream и дальше все функции и типы, как старые, так и новые, доступны по именам Stream.имяфункции (или же делаю вдобавок open Stream и использую unqualified names).
(Reply) (Parent) (Thread)