Ну вот на вскидку:
— Яндекс метрика работает только с сайтами на которые ходят реальные посетители. Вебсервис или API с помощью метрики проверить нельзя;
— Метрика работает только с http, мы http, ping, traceroute, mysql, smtp, pop3, mssql и т.д.
— В яндекс метрике нет эскалации алертов;
— Нельзя настроить точный интревал мониторинга;
— Нет распределенной проверки;
— Насколько я знаю, в метрике нельзя поделится своим аптаймом со своими клиентами/пользователями.
Знакомые делают подобную штуку, называется Tutorle. Но там скорее как комбинацию онлайн-сервиса и мобильных/десктопных приложений. Сейчас есть веб-интерфейс, и WinPhone приложение. На подходе вроде Android, iOS и Windows 8.
Можно заводить сколько угодно словарей и добавлять свои слова. Есть возможность проиграть произношение слов. Несколько видов тестов. Одна из фишек — все созданные словари и статистику обучения можно сбрасывать в облако и потом синхронизировать на любом другом устройстве.
Коллега, функция чистые во всех приведенных случаях. Извините, но я б на вашем месте, все таки еще раз прошелся по теории и закрепил бы ее на практике, перед тем как не к месту вставлять «вумные» цитаты, уж простите.
Про деревья, немного выше есть ответ с сылкой на континуацию и катаморфизм. Они как раз и преднозначены чтобы работать с графами,/деревьями без стека, на хвостовой рекурсии.
А в чем проблема с reverse?
let rec reverse acc lst =
match lst with
| [] -> acc
| hd :: tl -> reverse (hd :: acc) tl
Примитивы, да реализованы. Но это ведь только списки или последовательности. А что делать с деревьями, графами?
Кстати reverse, зря вы обидели, да и foldr тоже наверно.
Ок убедили. Но Давайте конкретику: 1) приведите строки из примеров в которых по вашему мнению пообочный эффект; 2) как их по вашему эти проблемные места следует переписать?
В функциональном подходе это делается с помощью континьюэйшенов и катоморфизма.
Если с английским нормально, то очень советую вот эту серию статей. Там восемь частей, и разбираются подходы к рекурсивной обработке сложных структур данных.
Если в одном предложении — то темлейты это система макросов работающая во время компиляции, а генерики это полноценные классы с поддержкой рантайма. Как сказал Один известный дядя:
Anders Hejlsberg: To me the best way to understand the distinction between C# generics and C++ templates is this: C# generics are really just like classes, except they have a type parameter. C++ templates are really just like macros, except they look like classes.
Starting with Microsoft in 1998, Don also created Generics in C# and in the .NET Common Language Runtime. He has been a functional programmer since 1989.
Насчет дотнета соглашусь. Ибо в дотнете, во первых, исключение — это исключение. А во вторых механизм исключений довольно тормознутый. Но есть языки где исключения, один из механизмов control flow.
К примеру, OCaml (папа F#) — там исключения рассматривается как нормальная практика построения логики. Не могу сказать что мне такой подход по душе, но тем не менее.
Ну так это C#, в котором, насколько я помню, как раз компилятор ничего не знает про хвостовую рекурсию. Поэтому и память жрется, и глубина вложенности ограничена.
Чем удобней? А вы не задумывались откуда в C# генерики, лямбды, LINQ?
Будем первыми :-). Но на самоом деле все хорошо с коммерческим ииспользованием. Так на вскидку — 2008 год. Сейчас если погуглить, то можно найти массу примеров.
let sumTailRec acc i =
if i <= 0L then acc
else sumTailRec (acc + i) (i - 1L)
Вызов:
> sumTailRec 0L i
Нюанс такой, что в таком более кратком варианте, у функции появляется дополнительный параметр — аккумулятор. В данном случае, это даже полезно, ибо мы можем пробрасывать начальное значение. Но очень часто, аккумулятор нет смысла показывать наружу, поэтому организуется внутренний цикл — функция loop, которая работает с аккумулятором.
Кроме того когда в функции более 5-ти строк, то эффект не такой драматический, как в данном случае когда размер кода увеличился почти на 100% :-)
— Яндекс метрика работает только с сайтами на которые ходят реальные посетители. Вебсервис или API с помощью метрики проверить нельзя;
— Метрика работает только с http, мы http, ping, traceroute, mysql, smtp, pop3, mssql и т.д.
— В яндекс метрике нет эскалации алертов;
— Нельзя настроить точный интревал мониторинга;
— Нет распределенной проверки;
— Насколько я знаю, в метрике нельзя поделится своим аптаймом со своими клиентами/пользователями.
Можно заводить сколько угодно словарей и добавлять свои слова. Есть возможность проиграть произношение слов. Несколько видов тестов. Одна из фишек — все созданные словари и статистику обучения можно сбрасывать в облако и потом синхронизировать на любом другом устройстве.
А в чем проблема с reverse?
Если у нас уже есть foldl и reverse
Кстати reverse, зря вы обидели, да и foldr тоже наверно.
Ключевая фраза.
Если мы говорим о достаточно сложных рекуррентных алгоритмах, то всяко лучше катоморфизм нежели императивный путь.
Чудес, к сожалению не бывает. Но зато после достаточно долго курения катаморфизма, часто наступает просветление.
Если с английским нормально, то очень советую вот эту серию статей. Там восемь частей, и разбираются подходы к рекурсивной обработке сложных структур данных.
Была еще небольшая статья на Хабре на эту тему.
Anders Hejlsberg: To me the best way to understand the distinction between C# generics and C++ templates is this: C# generics are really just like classes, except they have a type parameter. C++ templates are really just like macros, except they look like classes.
Ну и более Подробно.
Starting with Microsoft in 1998, Don also created Generics in C# and in the .NET Common Language Runtime. He has been a functional programmer since 1989.
Don Syme — автор F#
К примеру, OCaml (папа F#) — там исключения рассматривается как нормальная практика построения логики. Не могу сказать что мне такой подход по душе, но тем не менее.
Чем удобней? А вы не задумывались откуда в C# генерики, лямбды, LINQ?
Будем первыми :-). Но на самоом деле все хорошо с коммерческим ииспользованием. Так на вскидку — 2008 год. Сейчас если погуглить, то можно найти массу примеров.
Вызов:
Нюанс такой, что в таком более кратком варианте, у функции появляется дополнительный параметр — аккумулятор. В данном случае, это даже полезно, ибо мы можем пробрасывать начальное значение. Но очень часто, аккумулятор нет смысла показывать наружу, поэтому организуется внутренний цикл — функция loop, которая работает с аккумулятором.
Кроме того когда в функции более 5-ти строк, то эффект не такой драматический, как в данном случае когда размер кода увеличился почти на 100% :-)
А вот ноутбуки вы не разбираете?