Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Функциональные языки: общие вопросы > [F#] Простые вопросы |
Автор: laMer007 27.12.2011, 20:16 | ||
Мне нравится F#. Но большой практики написания программ на нём не было. Писал только вспомогательные тулзы для проектов. В этой теме хочу задавать вопросы по этому языку. И так, первые вопросы: 1)Есть ли в F# функция высшего порядка, подобная std::find_if? 2)Как из тела цикла возвращать значение, если искомый результат обнаруживается в конце или в середине цикла? Пример, когда результат обнаруживается http://ideone.com/27lqH цикла:
(Понятно, что тут должен быть поиск в каком-нибудь массиве, но это просто пример). 3)Как правильно получить последний элемент массива, не используя такую убогую конструкцию t.[t.Length-1]? 4)Как вы возвращаете значение из сложной функции с несколькими циклами и ветвлениями, ведь return нет в языке? Мне приходилось делать хак в виде присвоения мутабильной переменной result результата с последующим киданием исключения и отловом около последней строки функции, возвращающей этот сохраненный ранее result. Простите, мой испорченный императивными языками стиль программирования. Как сделать возврат значения из относительно сложной функции правильно по функциональному? |
Автор: k0rvin 27.12.2011, 21:40 | ||||
наверное этот ответ(как и другие) легко найти в описании языка, впрочем можно и самому написать, заодно и попрактиковался бы
как же ты писал тулзы для проектов? |
Автор: laMer007 28.12.2011, 01:07 | ||
Ладно. А что с другими вопросами 2-4? Если они не очень понятны, то я могу объяснить подробнее с конкретными примерами. |
Автор: k0rvin 28.12.2011, 08:43 | ||
что значит "не то"? и что ты подразумеваешь под обобщенными функциями? |
Автор: k0rvin 28.12.2011, 09:11 |
3) опять же, ищите или пишите функцию last Добавлено @ 09:23 2,4) думаю смотреть нужно в сторону продолжений (continuations), как-то http://controlflow.tumblr.com/post/2623145951/f-computation-expressions-part-3-cont |
Автор: k0rvin 28.12.2011, 14:42 | ||||||||
а, ты про это... это не "обобщенная функция", ну да не суть. я не знаю как там в F#, но наверное типы Array и List наследуются от одного какого-то общего предка Container или Collection, в котором определена find. иначе придется писать свои обертки. мб просто преобразовывать в http://msdn.microsoft.com/en-us/library/dd233209.aspx и юзать Seq.find Добавлено @ 14:45
а зачем раздувать стандартную библиотеку кучей мелочей? может быть у майкрософт есть набор дополнительных библиотек, где собраны различные полезные утилиты, не вошедшие в стандартную?
хз, я не шарю в F# |
Автор: Kakadu 28.12.2011, 15:29 | ||||||||||
Нет, для каждого контейнера (array, list, seq, etc) надо реализовывать свой поиск. естественно, желательно с той же сигнатурой. Тогда типовыводилка тип выведет и будет визуально как в плюсах.
http://ocaml.janestcapital.com/?q=node/91
Думаю так и получать. Но мне ни разу это пока не пригождалось. можно ещё List.reverse + List.head
кидание исключений в Ocaml это норм, в диезе думаю тоже. Мутабельное значение иногда некрасиво. Ну и про yeild_return можно подумать. |