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 04:17 pm (UTC)(link)
Айсед достаточно многие вещи считает говном. Насколько я понимаю, он админ, а не программист. Я ценю наличие ярко выраженного субъективного мнения у людей, но все-таки многое из этого приходится фильтровать.

По мне так C++ более автоматизирован чем pure C, но не приобрел неповоротливости языков класса Java. Что-то типа золотой середины. Но YMMV, как обычно.

[identity profile] paranoekk.livejournal.com 2011-10-28 05:01 pm (UTC)(link)
Если так внимательно посмотреть, то все успешные люди, которые чего-то добились реально и получают от жизни кайф, ведут себя очень скромно. А школотообразное поведение айседа рисует ему очень хреновый имидж несостоявшегося человека с комплексами, которого жестко обижали в школе одноклассники. При чем безотносительно насколько это реально имеет место.

[identity profile] metaclass.livejournal.com 2011-10-28 05:19 pm (UTC)(link)
Айсед программист :)

[identity profile] noop.livejournal.com 2011-11-07 08:02 pm (UTC)(link)
А вы кавычки пропустили.

[identity profile] theiced.livejournal.com 2011-10-28 06:58 pm (UTC)(link)
про какую из вещей обосновать что она говно? я вон утром М обосновал что перл говно.

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

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

[identity profile] permea-kra.livejournal.com 2011-10-28 07:38 pm (UTC)(link)
Хуй с ним, что он тысячу страниц. Вы мне скажите, сколько компиляторов его полностью поддерживают ?

[identity profile] theiced.livejournal.com 2011-10-29 07:40 am (UTC)(link)
ноль.

[identity profile] nivanych.livejournal.com 2011-10-30 08:32 am (UTC)(link)
Как говориццо, "Но мы его любим не за это!" ;-) ;-)

[identity profile] noop.livejournal.com 2011-11-07 08:01 pm (UTC)(link)
В теории плюсы говно. На практике у каждого программиста на плюсах есть любимое подмножество языка, которое вполне себе работает.

[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 бэкэнд.

(no subject)

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

(no subject)

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

(no subject)

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

(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)
перл красив лаконичностью :)

(no subject)

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

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

(no subject)

[identity profile] theiced.livejournal.com - 2011-10-29 14:53 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2011-10-29 15:35 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2011-10-29 15:37 (UTC) - Expand

(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

(no subject)

[identity profile] theiced.livejournal.com - 2011-10-29 15:21 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2011-10-29 15:38 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2011-10-29 15:42 (UTC) - Expand

(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 хорошо подходит, я не знаю зачем у нас на них серверную часть пишут.