Найти - Пользователи
Полная версия: Задача на сумму факториалов
Начало » Центр помощи » Задача на сумму факториалов
1 2 3 4
py.user.next
Rodegast
Erlang разочаровывает.
Десятки тысяч легковесных процессов, распределённые между разными компами и общающиеся друг с другом посредством аналога почтовых ящиков. Работа 24 часа в сутки 7 дней в неделю на протяжении месяцев без остановки. Интеграция с другими языками вроде C для запроса сложных вычислений. Переносимая виртуальная машина, позволяющая запускать с одинаковой эффективностью один и тот же код на абсолютно разных системах. Бесконечная рекурсия, не требующая памяти. Изменение кода выполняющейся программы без её перезапуска.

А на Haskell'е что? Удобный REPL, компиляция исходников и всё. Потому и программы сегодняшние на других языках написаны.
Rodegast
> Десятки тысяч легковесных процессов…. бла-бла-бла

Я не против Erlang-а, я просто думал что такая приметившая задача должна была решаться более простым образом.

> А на Haskell'е что? Удобный REPL, компиляция исходников и всё.

http://eax.me/cloud-haskell-vs-erlang/
http://eax.me/erlang-is-specific/
py.user.next
Rodegast
такая приметившая задача должна была решаться более простым образом
Там просто списки вынесены в модуль и для списков определены свои операции. Суммирование - это списочное суммирование. Свёртка - это списочная свёртка. Таким образом в Erlang'е есть множество разных структур данных и для каждой определён свой набор операций. Поэтому там есть графы даже со своими операциями, в которых сразу можно узлы и рёбра делать и всё будет работать. И ещё функции там перегруженные - то есть в зависимости от количества аргументов вызывается тот или иной вариант функции для выполнения операции над заданным типом.

А в Haskell'е у тебя сумма, и как она суммирует? А другой тип ей подать, она его тоже суммировать будет? Подай ей строки, посмотрим, как она их просуммирует.
Вот такой список
["abc", "def"]

Eshell V5.10.4  (abort with ^G)
1> l(string).
{module,string}
2> ["abc", "def"].
["abc","def"]
3> string:join(["abc", "def"], []).
"abcdef"
4>
Eshell V5.10.4  (abort with ^G)
1> lists:concat(["abc", "def"]).
"abcdef"
2>
Eshell V5.10.4  (abort with ^G)
1> lists:merge(["abc", "def"]).
"abcdef"
2>
Eshell V5.10.4  (abort with ^G)
1> lists:foldr(fun erlang:'++'/2, [], ["abc", "def"]).
"abcdef"
2>
А я могу ещё вот так сделать
Eshell V5.10.4  (abort with ^G)
1> lists:concat(["abc", 12345, "def", 6789, 'alpha centavra']).
"abc12345def6789alpha centavra"
2>
Rodegast
> Там просто списки вынесены в модуль….операции над заданным типом.

Ты меня ничем не удивил.

> А в Haskell'е у тебя сумма, и как она суммирует?
 Prelude> :i sum
sum :: Num a => [a] -> a        -- Defined in `Data.List'
Как видишь она складывает все элементы списка если они относятся к классу типов Num

> А другой тип ей подать, она его тоже суммировать будет? Подай ей строки, посмотрим, как она их просуммирует.

Строки не относятся к классу типов Num по этому что бы sum их сконкатенировал нужно создать соответствующий экземплар класса типов:
 {-# LANGUAGE FlexibleInstances #-}
instance Num [Char] where
	(+) = (++)
	fromInteger = (\ _ -> [])
*Main> sum ["abc", "def"]
"abcdef"
Как видишь всё работает.
4kpt_V
Rodegast
И это Вы считаете читаемым кодом? Серьезно? Блин. Ну тогда я пока на питоне посижу
Rodegast
А в чём проблема? Если что-то не понятно спрашивай, объясню как могу.
doza_and
Rodegast
И это Вы считаете читаемым кодом?
Прям как в мульфильме - крылья, ноги… главное хвост!
Что на хаскеле что на эрланге алгоритм то хуже чем самое первое что предложили… :)
py.user.next
Rodegast
Ты меня ничем не удивил.
Просто нет в языке этих функций, так как они слишком специфичные. А в Haskell'е что-то добавили, а оно не складывает всё, а только определённые числа какие-то. А для строк там делают concat. А для матриц что сделают? Так язык и переполняется всякой ерундой специфичной. А когда оно в модулях, язык чистым остаётся. Пример - C, у которого даже функции ввода/вывода вынесены в библиотеку были изначально, поэтому он пережил Паскаль, у которого консольный ввод/вывод был прямо в язык встроен. Поэтому сишник спокойно садится туда, где вообще консоли нет (ядро системы, в котором вообще своя функция вывода). Вот о чём речь. В питоне функция sum полиморфная, а в Haskell'е - нет, но при этом в сам язык зашита.

Rodegast
Как видишь всё работает.
Давай матрицы сложи. В питоне это легко делается, в Erlang'е для этого модуль есть. На Haskell'е должно легко реализовываться, по-твоему (модуля нет?). Но мы тут не про модуль, а про то, хорош ли Haskell на второй взгляд.

Rodegast
Строки не относятся к классу типов Num по этому что бы sum их сконкатенировал нужно создать соответствующий экземплар класса типов:
А вот что можно добавить в список в Erlang'е - всё можно добавить
Eshell V5.10.4  (abort with ^G)
1> [1, "a", {jimbo, [true,false], {yes, no}}, 'a b c d'].
[1,"a",{jimbo,[true,false],{yes,no}},'a b c d']
2>
И потом с этим списком работают любые списочные функции.
PooH
py.user.next
А в Haskell'е что-то добавили, а оно не складывает всё, а только определённые числа какие-то. А для строк там делают concat. А для матриц что сделают? Так язык и переполняется всякой ерундой специфичной.
А она и есть специфичная. От сложения ожидаешь, как минимум, коммутативности, а случае строк им и не пахнет.
py.user.next
PooH
От сложения ожидаешь, как минимум, коммутативности
  
>>> 'a' + 'b'
'ab'
>>> 'a' + 'b' == 'b' + 'a'
False
>>>
То, что операция сложения коммутативна, само по себе является частным случаем операции. Операция разности, например, не коммутативна. А на множестве матриц операция умножения не коммутативна.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB