Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Ocaml] Функциональный разбор аргументов 
V
    Опции темы
technologer
  Дата 25.9.2012, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.9.2012

Репутация: нет
Всего: нет



Доброе всем время суток!
Пытаюсь понять что такое FP на примере OCaml, переписывая небольшой утилитарный скрипт с императивного языка.
Проблемы начались сразу:
- не получается придумать как легко и дёшево разобрать параметры коммандной строки
- получается только с использованием ссылок:

Код

(* Параметров в пару раз больше чем здесь, просто для краткости порезал *)
let inputXMLPath = ref "localization_client.txt";;(* значения по умолчанию *)
let outputXMLPath = ref "locale";;
let outputXMLName = ref "localization";;
let packagePath = ref "";;
let arg_spec = [
    ("-inputXMLPath", inputXMLPath);
    ("-outputXMLPath", outputXMLPath);
    ("-outputXMLName", outputXMLName);
    ("-packagePath", packagePath);
];;
exception Error of string;;

(*
Берём параметры коммандной строки, они записываются в стиле:
ocaml str.cma generator.ml -outputXMLPath "aaaaa" -packagePath ""
*)
let args = List.tl (Array.to_list Sys.argv);;

(* Распихиваем по 4 ссылкам, перечисленным в arg_spec *)
let rec read_args args =
    match args with
    | [] -> ()
    | x::[] -> raise (Error ("Elone argument option " ^ x))
    | key::v::tail ->
        let pair = (
            try List.find (fun pair -> fst pair = key) arg_spec
            with Not_found -> raise (Error ("Unknown option " ^ key))
        ) in
        let vRef = snd pair in
        vRef := v;
        read_args tail;;
read_args args;;

(* Выводим всё что прочитали и что по умолчанию *)
print_string "parameters:\n";;
List.iter (fun (key, v) -> print_string (key ^ " = " ^ !v ^ "\n")) arg_spec;;


Если уже в этом простом случае приходится использовать мутабельные конструкции, то какое дальше может быть FP?
Подскажите, чего я делаю не так.
PM MAIL   Вверх
tzirechnoy
Дата 25.9.2012, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



Возьмите erlang. Там гораздо меньшэ мутабельных конструкцый, потому таких вопросов не встаёт. ВСё-таки у lisp и ocaml слишком просто писать в императивном стиле (а в haskell вообще тяжэло писать, хоть как-то, и поначалу получается ад, а clean я не знаю).
PM MAIL   Вверх
technologer
Дата 25.9.2012, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.9.2012

Репутация: нет
Всего: нет



Ну не верю я, что есть что-то такое в Erlang, чего нет в OCaml, и без чего нельзя вышеприведённый код перегнать в немутабельный вид.
Люди, вон говорят, что код чуть ли не копипастили с Haskell в OCaml для повышения производительности - и всё заработало (а haskell вроде чисто-фукциональный язык)

Т.е. "В OCaml много мутабельных функций" != "В OCaml невозможно кодить функционально"

И всё-тки нужен OCaml

Это сообщение отредактировал(а) technologer - 25.9.2012, 19:40
PM MAIL   Вверх
k0rvin
Дата 26.9.2012, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: нет
Всего: 5



Чисто функциональный пример на Хаскелле (без использования исключений): http://ideone.com/5dGQB
Код

D:\usr\Development\haskell> ghc -o test test.hs
[1 of 1] Compiling Main             ( test.hs, test.o )
Linking test.exe ...

D:\usr\Development\haskell> test -inputXMLPath "foo.xml" -xxx bar -yyy
Error: unknown option -xxx
Error: alone argument option -yyy
Parameters:
-inputXMLPath = foo.xml
-outputXMLPath = locale
-outputXMLName = localization
-packagePath = 

D:\usr\Development\haskell>


На Окамле будет примерно так: http://ideone.com/HFtWW

Добавлено через 3 минуты и 18 секунд
Цитата(technologer @ 25.9.2012,  19:39)
Т.е. "В OCaml много мутабельных функций" != "В OCaml невозможно кодить функционально"

Но это и не значит, что нужно кодить функционально везде, где только можно.

Кстати про Ocaml vs Haskell можно почитать здесь. Точнее почему в итоге чел сменил окамл на хаскелл.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
technologer
Дата 26.9.2012, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.9.2012

Репутация: нет
Всего: нет



k0rvin, спасибо!
Теперь гораздо понятнее что такое функциональный подход.

Только вот как брать теперь эти значения из списка.
Самое первое что приходит в голову - это сделать функцию, берующую значение из списка по ключу. Видимо, так и придётся сделать.

Цитата

Но это и не значит, что нужно кодить функционально везде, где только можно.

Так про какой угодно подход можно сказать. Проблема была в том, что не понимал как это вообще сделать функционально.

Цитата

Кстати про Ocaml vs Haskell можно почитать здесь. Точнее почему в итоге чел сменил окамл на хаскелл.

Нисколько не сомневаюсь, что Haskell круче OCaml в функциональном плане, но OCaml выглядит практиченее/производительнее + проект в который тянет залезть с напильником написан на OCaml

Это сообщение отредактировал(а) technologer - 26.9.2012, 15:12
PM MAIL   Вверх
k0rvin
Дата 26.9.2012, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: нет
Всего: 5



Цитата(technologer @ 26.9.2012,  15:09)
Нисколько не сомневаюсь, что Haskell круче OCaml в функциональном плане, но OCaml выглядит практиченее/производительнее + проект в который тянет залезть с напильником написан на OCaml

Вообще-то там по ссылке как раз про практичность/производительность.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
technologer
Дата 26.9.2012, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.9.2012

Репутация: нет
Всего: нет



А вот здесь наоборот, начинали на Haskell, а потом перешли на OCaml из-за производительности
Кое-что про Erlang

P.S. Наверно это не важно, но на всякий случай:
конструкция
Код

let rec tryReplace key aval args = match args
        with []                        -> None
        | ((k, v)::rest) when k == key -> Some ((key, aval)::rest)
        | ((k, v)::rest)               -> match tryReplace key aval rest
                with Some xs -> Some ((k, v)::xs)
                |    None    -> None ;;

не срабатывала, пока не заменил "==" на "=", а так всё работает как ожидалось


Это сообщение отредактировал(а) technologer - 27.9.2012, 18:26
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума «Функциональные языки: общие вопросы»
Void
  • Пожалуйста, создавайте темы с содержательными названиями. Если у Вас вопрос по конкретному языку, укажите его в заголовке, например: «[Haskell] Как использовать монаду State».
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Функциональные языки: общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1180 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.