metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2011-10-28 06:34 pm

Интересное мнение про Haskell

http://neugierig.org/software/blog/2011/10/why-not-haskell.html
http://www.reddit.com/r/programming/comments/lfm1k/why_not_haskell/

У меня на данный момент с хаскелем забавный мозговой тупик: не совсем понимаю, как писать идиоматический код.

Т.е. например, разговор с девайсом по RS232 я могу написать в лоб, со сплошным IO, могу оформить с кошерными iteratees (хотя от типов и там и в coroutines глаза кровоточат), по идее, если покопаться, можно придумать еще несколько способов "красиво, строго, надежно" оформить разговор по известному протоколу, но в итоге то, что подразумевает повторное использование и статические гарантии, выглядит как ад из типов, а то что понятно - выглядит точно так же, как эта самая программа написанная на другом языке, с точностью до синтаксиса )

Вообще, от софта хочется простого: кроссплатформенность(винда/линукс), никаких JRE/Mono/CLI/интерпретаторов питонов/рубей, минимум зависимостей, отсутствие ручной работы с выделением-удалением памяти, нормальные строки, более-менее строгие типы.

[identity profile] vaddimka.livejournal.com 2011-10-28 07:06 pm (UTC)(link)
ну вот перл, например, мне тоже не нравится :)
писал год на нем, не прижилось, хотя платили неплохо

в любой вещи есть свои недостатки, поэтому я и говорю про YMMV. для каких-то задач плюсы годятся, для каких-то не очень.

у меня тут пол офиса укушенных, так они на objective-c пишут и тоже от плюсов нос воротят. я пробовал - у меня получается в три раза медленнее чем на плюсах. а на чистых сях - в два раза дольше.

[identity profile] theiced.livejournal.com 2011-10-28 07:08 pm (UTC)(link)
про обжцэ я ша у себя поишу.

[identity profile] vaddimka.livejournal.com 2011-10-28 07:12 pm (UTC)(link)
objective-c хорош для макоебских гуев, у нас просто локально на них зачем-то серверную часть товарищи пишут. и их много. это меня пугает.

[identity profile] theiced.livejournal.com 2011-10-28 07:20 pm (UTC)(link)
обжцэ плох абсолютно для всего (как и цэскрестикми). тот же хаскель вполне себе хорошо для мелких задачек класса дёрнуть-страничку-попарсить-насрать-в-базу.

[identity profile] avnik.livejournal.com 2011-10-28 11:17 pm (UTC)(link)
А как хацкель-для-уеба будет под нагрузкой жить? Ну хотя бы под минимальной?

Если уж хочется чего-то правильного -- тогда ерлангъ

PS Кстати может и правда, давайте ребе метаклассу еролангъ присоветуем

[identity profile] metaclass.livejournal.com 2011-10-29 07:37 am (UTC)(link)
Хаскель для веба нормально, говорят.

[identity profile] kurilka.livejournal.com 2011-10-29 08:00 am (UTC)(link)
http://www.yesodweb.com/blog/2011/02/warp-speed-ahead например есть такие левые цифры или лучше http://www.yesodweb.com/blog/2011/03/preliminary-warp-cross-language-benchmarks
Есть подозрение (хотя лучше бы сделать бенчмарки), что Эрланговые решения окажутся на этих графиках не впереди планеты всей, тем более если отдаваться будет что-нибудь сложнее hello world.
BTW сейчас пытаюсь изобразить для нового проекта решение на Warp/Yesod, правда оно не совсем "традиционный" веб (на что в основном Yesod рассчитан), а REST/XML бэкэнд.

[identity profile] avnik.livejournal.com 2011-10-29 08:06 am (UTC)(link)
Ну насколько я знаю, ерланг хорош в случаях, когда нельзя терять коннекты.
Оно будет их хоть и медленно, жевать тысячами

[identity profile] kurilka.livejournal.com 2011-10-29 08:11 am (UTC)(link)
В Хаскеле тоже лёгкая многозадачность, thesz даже хвастался, что стек на поток меньше чем в эрланге.
Другое дело, что в Эрланге инфраструктура для обеспечения этой многозадачности шире и проработанней (ибо осн. задача).
А так и ежу понятно, что инструмент надо подбирать под задачу.

[identity profile] avnik.livejournal.com 2011-10-29 08:13 am (UTC)(link)
Тут дело даже не в процессах, а в памяти -- хацкель ее любит, и насколько я знаю в слабопрогнозируемых объемах.

(no subject)

[identity profile] kurilka.livejournal.com - 2011-10-29 08:27 (UTC) - Expand

[identity profile] theiced.livejournal.com 2011-10-28 07:13 pm (UTC)(link)
(BOOL)isEmptyString:(NSString*)string {
    return string == nil 
    || string == NSNull
    || string == (NSString*)kCFNull
    || [[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] isEqualToString:@""];
}


извинте, сразу стрелять, не разговаривая.

perl -e "%a = {1 => 2, 3 => 4}; print '' . %a;"
1/8


ну и вот. идиоматический цэскрестиками. прямо из буста

  template
[Error: Irreparable invalid markup ('<lt;>') in entry. Owner must fix manually. Raw contents below.]

<pre>
(BOOL)isEmptyString:(NSString*)string {
return string == nil
|| string == NSNull
|| string == (NSString*)kCFNull
|| [[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] isEqualToString:@""];
}
</pre>

извинте, сразу стрелять, не разговаривая.

<pre>
perl -e "%a = {1 => 2, 3 => 4}; print '' . %a;"
1/8
</pre>

ну и вот. идиоматический цэскрестиками. прямо из буста

<pre>
template<lt;
typename R,
BOOST_SIGNALS_TEMPLATE_PARMS
BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS
typename Combiner,
typename Group,
typename GroupCompare,
typename SlotFunction
>gt;
typename BOOST_SIGNALS_SIGNAL<lt;
R, BOOST_SIGNALS_TEMPLATE_ARGS
BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS
Combiner, Group, GroupCompare, SlotFunction>gt;::result_type
BOOST_SIGNALS_SIGNAL<lt;
R, BOOST_SIGNALS_TEMPLATE_ARGS
BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS
Combiner, Group, GroupCompare, SlotFunction
>gt;::operator()(BOOST_SIGNALS_PARMS) const
{
// Notify the slot handling code that we are making a call
BOOST_SIGNALS_NAMESPACE::detail::call_notification notification(this->gt;impl);

// Construct a function object that will call the underlying slots
// with the given arguments.
#if BOOST_SIGNALS_NUM_ARGS == 0
BOOST_SIGNALS_ARGS_STRUCT_INST args;
#else
BOOST_SIGNALS_ARGS_STRUCT_INST args(BOOST_SIGNALS_ARGS);
#endif // BOOST_SIGNALS_NUM_ARGS >gt; 0

call_bound_slot f(&args);

typedef typename call_bound_slot::result_type call_result_type;
optional<lt;call_result_type>gt; cache;

// Let the combiner call the slots via a pair of input iterators
return combiner()(slot_call_iterator(notification.impl->gt;slots_.begin(),
impl->gt;slots_.end(), f, cache),
slot_call_iterator(notification.impl->gt;slots_.end(),
impl->gt;slots_.end(), f, cache));
}
} // namespace boost
</pre>

[identity profile] theiced.livejournal.com 2011-10-28 07:15 pm (UTC)(link)
ещё раз. крестики.

  template<
    typename R,
    BOOST_SIGNALS_TEMPLATE_PARMS
    BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS
    typename Combiner,
    typename Group,
    typename GroupCompare,
    typename SlotFunction
  >
  typename BOOST_SIGNALS_SIGNAL<
             R, BOOST_SIGNALS_TEMPLATE_ARGS
             BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS
             Combiner, Group, GroupCompare, SlotFunction>::result_type
  BOOST_SIGNALS_SIGNAL<
    R, BOOST_SIGNALS_TEMPLATE_ARGS
    BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS
    Combiner, Group, GroupCompare, SlotFunction
  >::operator()(BOOST_SIGNALS_PARMS) const
  {
    // Notify the slot handling code that we are making a call
    BOOST_SIGNALS_NAMESPACE::detail::call_notification notification(this->impl);

    // Construct a function object that will call the underlying slots
    // with the given arguments.
#if BOOST_SIGNALS_NUM_ARGS == 0
    BOOST_SIGNALS_ARGS_STRUCT_INST args;
#else
    BOOST_SIGNALS_ARGS_STRUCT_INST args(BOOST_SIGNALS_ARGS);
#endif // BOOST_SIGNALS_NUM_ARGS > 0

    call_bound_slot f(&args);

    typedef typename call_bound_slot::result_type call_result_type;
    optional<call_result_type> cache;

    // Let the combiner call the slots via a pair of input iterators
    return combiner()(slot_call_iterator(notification.impl->slots_.begin(),
                                         impl->slots_.end(), f, cache),
                      slot_call_iterator(notification.impl->slots_.end(),
                                         impl->slots_.end(), f, cache));
  }
} // namespace boost


[identity profile] theiced.livejournal.com 2011-10-28 07:15 pm (UTC)(link)
перл

perl -e "%a = {1 => 2, 3 => 4}; print '' . %a;"
1/8

[identity profile] black-angel-by.livejournal.com 2011-10-29 08:33 am (UTC)(link)
перл красив лаконичностью :)

[identity profile] theiced.livejournal.com 2011-10-29 08:45 am (UTC)(link)
дада. только тот же руби лаконичнее. хаскель лаконичнее. лисп лаконичнее. а так перл хорош лаконичностью, не поспоришь.

[identity profile] tzirechnoy.livejournal.com 2011-10-29 10:37 am (UTC)(link)
Я так и не понял, что ты имел в виду, приводя пример безсмысленного перлового кода.

[identity profile] theiced.livejournal.com 2011-10-29 02:53 pm (UTC)(link)
любой код на перле бессмысленен.

[identity profile] tzirechnoy.livejournal.com 2011-10-29 03:35 pm (UTC)(link)
Учитывая, что я видел примеры обратного, переформулируем так: любой код на перле, написанный айседом, безсмысленнен.

[identity profile] theiced.livejournal.com 2011-10-29 03:37 pm (UTC)(link)
я не видел. весь перлоговнокод говно, каша и пиздец. приведите примеры обратного.

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2011-10-30 08:07 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2011-10-30 08:09 (UTC) - Expand

[identity profile] theiced.livejournal.com 2011-10-29 03:21 pm (UTC)(link)
и таки да. это поведение докментированно.

[identity profile] tzirechnoy.livejournal.com 2011-10-29 03:38 pm (UTC)(link)
Да я знаю. Я как увидел код -- сразу попытался понять, зачем оно так написано, для чего полез в документацыю выяснять, почему оно так работает. Ну нашёл, да, делов-то. Но нафига писать такой код -- так и не понял.
Кстати, когда читал -- дажэ не припомнил, чтобы я до этого это как-то знал. То есть мне это было не нужно. То есть пример какой-то совсем безсмысленный.

[identity profile] theiced.livejournal.com 2011-10-29 03:42 pm (UTC)(link)
а чо. прочитал в книжке "перл за 24 часа" про хэши, что они с % начинаются. сделал хэш

%a = {1 => 2, 3 => 4};

и решил его вывести что бы проверить что я его сделал правильно

print 'my hash is ' . %a;

внезапно. ну вот вполне себе живой юзкейс. да вообще там бай "дизайн" пиздецов на каждом шагу. array flatten, блеать. убивать убивать убивать.

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2011-10-30 08:01 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2011-10-30 08:09 (UTC) - Expand

[identity profile] theiced.livejournal.com 2011-10-28 07:16 pm (UTC)(link)
обжцэ.

(BOOL)isEmptyString:(NSString*)string {
return string == nil 
|| string == NSNull
|| string == (NSString*)kCFNull
|| [[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] isEqualToString:@""];
}

[identity profile] noop.livejournal.com 2011-11-07 08:08 pm (UTC)(link)
Когда я в юности перестал писать на паскале и перешел на C, не мог написать циклы и присваивания без ошибки, такова сила привычки.
Та же хрень с Obj-C. Там есть грабли, но при наличии опыта маковские гуи пишутся удобно и просто, без напряжения серого вещества, если просто следовать примерам из мануалов. И все. Желания фанатично тащить этот язык в другие области не возникало и вряд ли возникнет.

[identity profile] vaddimka.livejournal.com 2011-11-07 11:04 pm (UTC)(link)
воот! для гуев objective-c хорошо подходит, я не знаю зачем у нас на них серверную часть пишут.