Интересное мнение про 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/интерпретаторов питонов/рубей, минимум зависимостей, отсутствие ручной работы с выделением-удалением памяти, нормальные строки, более-менее строгие типы.
http://www.reddit.com/r/programming/comments/lfm1k/why_not_haskell/
У меня на данный момент с хаскелем забавный мозговой тупик: не совсем понимаю, как писать идиоматический код.
Т.е. например, разговор с девайсом по RS232 я могу написать в лоб, со сплошным IO, могу оформить с кошерными iteratees (хотя от типов и там и в coroutines глаза кровоточат), по идее, если покопаться, можно придумать еще несколько способов "красиво, строго, надежно" оформить разговор по известному протоколу, но в итоге то, что подразумевает повторное использование и статические гарантии, выглядит как ад из типов, а то что понятно - выглядит точно так же, как эта самая программа написанная на другом языке, с точностью до синтаксиса )
Вообще, от софта хочется простого: кроссплатформенность(винда/линукс), никаких JRE/Mono/CLI/интерпретаторов питонов/рубей, минимум зависимостей, отсутствие ручной работы с выделением-удалением памяти, нормальные строки, более-менее строгие типы.
no subject
извинте, сразу стрелять, не разговаривая.
ну и вот. идиоматический цэскрестиками. прямо из буста
(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>
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
Кстати, когда читал -- дажэ не припомнил, чтобы я до этого это как-то знал. То есть мне это было не нужно. То есть пример какой-то совсем безсмысленный.
no subject
%a = {1 => 2, 3 => 4};
и решил его вывести что бы проверить что я его сделал правильно
print 'my hash is ' . %a;
внезапно. ну вот вполне себе живой юзкейс. да вообще там бай "дизайн" пиздецов на каждом шагу. array flatten, блеать. убивать убивать убивать.
no subject
no subject
no subject