LINUX.ORG.RU
Ответ на: комментарий от monk

4. Там, где в питоне что-то врое

def process(context, templateFile, outFile):
  with open(templateFile) as f:
    with open(outFile, "w") as fOut:
      for line in f:
        context = processLine(processTemplate, context, line)
      fOut.write(reverse(context.result).join("\n))

Если не сидеть на замшелом 2.5, то можно обойтись одним блоком with:

def process(context, templateFile, outFile):
    with open(templateFile) as f, open(outFile, "w") as fOut:
        for line in f:
            context = processLine(processTemplate, context, line)
        fOut.write(reverse(context.result).join("\n))

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Если не сидеть на замшелом 2.5, то можно обойтись одним блоком with:

Я не про синтаксис, а про идеологию. Вместо явного указания операций чтения/записи можно сделать конвейер как в шелле. Причём, также как и в шелле файл будет не целиком читаться в память, а необходимыми кусками.

monk ★★★★★
()
Ответ на: комментарий от monk

«Спервадобейся»? Если предметно, то какая-то радужная картина нарисована: «дома строятся, пароходы ходят, самолеты летают».

Virtuos86 ★★★★★
()
Ответ на: комментарий от monk

Я не про синтаксис, а про идеологию. Вместо явного указания операций чтения/записи можно сделать конвейер как в шелле. Причём, также как и в шелле файл будет не целиком читаться в память, а необходимыми кусками.

Переопредели какой-нибудь оператор, например, «|», и имитируй конвейер. И open(файл) не читает память в файл целиком сам по себе, а создает объект файла, а в цикле for приводится к построчному итератору. В питоне вообще идеология ленивых структур данных aka итераторов процветает.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от monk

Причём вся цепочка автоматически проверяется на корректность. Если я в питоне вместо fOut.write(reverse(context.result).join(«\n)) напишу fOut.write(reverse(context).join(»\n)), то про ошибку узнаю при запуске, а в Haskell если пропущу в конце ". result", то при компиляции он укажет, что такой комбинации функций быть не может (reverse ожидает список, а не структуру Context).

Это заслуга не хаскеля, а статической, строгой типизации.

RazrFalcon ★★★★★
()

зачем внедрять язык разработки в продакшен? может программы на хаскеле?

xmikex ★★★★
()
Ответ на: комментарий от Virtuos86

какая-то радужная картина нарисована: «дома строятся, пароходы ходят, самолеты летают»

Так вопрос стоял «Чем может понравиться хаскел программисту на питоне?». Отсюда и такой ответ. У меня основной язык не питон, поэтому написал не своё мнение, а цитату с хабра.

Переопредели какой-нибудь оператор, например, «|», и имитируй конвейер.

Согласен. Можно написать программу на хаскеле (как и на фортране) на любом языке.

monk ★★★★★
()
Ответ на: комментарий от RazrFalcon

Это заслуга не хаскеля, а статической, строгой типизации.

Так статическая строгая типизация и есть одна из черт хаскеля.

По большому счёту все возможности хаскеля являются заслугами или чистоты или ленивости или типизации или функционального подхода с каррированием.

monk ★★★★★
()
Ответ на: комментарий от monk

Ну так это не я записываю это в преимущества хаскеля.

RazrFalcon ★★★★★
()
Ответ на: комментарий от monk

Легко унижать питон, где убогие даже цепочку методов ниасилили для встроенных типов. А с любым другим современным языком могущество хаскеля будет уже не столь очевидно.

anonymous
()
Ответ на: комментарий от Unununij

Пару лет назад, но я бы с радостью еще раз попробовал, если бы было ощущение перспективы. Мне кажется, что eta заборол этот проект, хотя это только мое мнение.

В любом случае, это же здорово, когда написанный на haskell код без изменений работает на java, пусть и медленнее, иногда в разы. А для frege надо переписывать код

dave ★★★★★
()
Ответ на: комментарий от monk

По большому счёту все возможности хаскеля являются заслугами или чистоты или ленивости или типизации или функционального подхода с каррированием.

То есть Haskell ничем не отличается от любого другого ML-подобного языка?

aedeph_ ★★
()
Ответ на: комментарий от dave

Это от которой все воют в голос и на любой Nix готовы свалить, лишь бы избежать приступа PTSD от слов «cabal hell»? Что ж ты там такого повидал, бедняга...

t184256 ★★★★★
()
Ответ на: комментарий от yoghurt

Ну хз

Using STM is like using a high-level language instead of asse mbly code – you can still write buggy programs, but many tricky bugs simply c annot occur, and it is much easier to focus attention on the higher-level aspe cts of the program. There is, alas, no silver bullet that will make concurrent pr ograms easy to write. But STM looks like a promising step forward, and one that will help you write beautiful code

pinachet ★★★★★
()
Ответ на: комментарий от t184256

Кабал хелл не актуален с тех пор как есть stack. Открой его для себя и будь счастлив.

Инфраструктура действительно хорошая. Я не знаю что там в карго, но тут просто и удобно. Если не лезть в детали, то похоже на npm или bower. Т.е. прописываешь в соотвествующем конфиге.

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

Только вчера собрал заброшенный два года назад, просто стянув кабалом последние пакеты и бампнув версии в .cabal файле - даже заработало. А что, кабал больше не используют, совсем? Стэк его полная замена?

yoghurt ★★★★★
()
Ответ на: комментарий от t184256

про stack еще не слышали в ваших краях? бедняги

dave ★★★★★
()
Ответ на: комментарий от yoghurt

Cabal нужен для Stack. Они взаимосвязаны. Библиотеки Stackage используют библиотеки Hackage, да и проект stack использует файл *.cabal

dave ★★★★★
()
Ответ на: комментарий от yoghurt

Но что есть особенного в stack, так это, что там запросто настроить так, что нужная библиотека будет тянутся откуда угодно, да хоть с github. Политика Hackage такова, что туда нельзя выгружать библиотеки под собственнической лицензией. В stack их использовать можно запросто!

dave ★★★★★
()
Ответ на: комментарий от yoghurt

Кабал файл нужен, стек его использует. И афаик, стек соотвесвенно используюет библиотеки кабал, но не саму утилиту.

При этом стек умеет устанавливать нужные каждому проекту зависимости так что они не конфликтуют, полностью прозрачно для пользователя.

AndreyKl ★★★★★
()
Ответ на: комментарий от littlechris

Просто раздражает такая нечестность, когда говорят об отличности хаскельной инфраструктуры.

А на счёт leksah, спасибо, что напомнил. Бросьте камень в того, кто скажет, что IDE для Haskell - не больная тема.

anonymous
()
Ответ на: комментарий от Unununij

И что? Ты считаешь, это говорит об отличности инфраструктуры, если для нормального использования языка (читай - с возможностями современных IDE) нужно осиливать вим или емакс? Или ты из тех, для кого в мире есть труъ- и нетруъ- вещи?

Пока не допилят хотя бы language server protocol для хаскеля, всё так и будет в виде кучи разрозненных утилит.

anonymous
()
Ответ на: комментарий от anonymous

если для нормального использования языка (читай - с возможностями современных IDE) нужно осиливать вим или емакс?

Продолжай дальше писать на пыхе и питоне, там все хорошо со средами, не отвлекайся.

anonymous
()
Ответ на: комментарий от anonymous

нужно осиливать вим или емакс?

Зачем вам хаскель?

ugoday ★★★★★
()
Ответ на: комментарий от grem

в Haskell внутрь pure функции можно вставить не-pure функцию (не помеченную как она, но на самом деле pure)?

В Haskell технически невозможно сделать «не помеченную как она, но на самом деле pure» функцию. Потому что, pure функция возвращает результат, а не-pure возвращает «действие», из которых потом компонуется функция main.

Например:

f x y = x + y -- чистая

f1 :: (Num a) => a -> a -> IO a
f1 x y = return (x + y) 

Впрочем, использовать можно. Например [f1 1 2, f1 3 4] вернёт список из двух действий «вернуть 3» и «вернуть 7».

Если достоверно известно, что действие эквивалентно «вернуть ...» и ничего больше не делает, то получить результат можно через unsafePerformIO. Обычно такое надо для FFI (по умолчанию любая внешняя функция возвращает IO).

monk ★★★★★
()
Ответ на: комментарий от aedeph_

То есть Haskell ничем не отличается от любого другого ML-подобного языка?

Любого другого ML-подобного c чистотой и ленивостью.

monk ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

lisp стоит использовать из-за repl. Ну и раньше в нем были фичи которые только недавно ввели в другие языки.
А хаскель можно для развлечения изучать. )))
Я слышал только что в хаскель плохая система типов. Но в них я не разбираюсь.
И нужно знать «теорию категорий» которая по моему на практике себя за все годы ни как не показала. Изучать сложно а пользы 0.

Int0l ★★
()
Последнее исправление: Int0l (всего исправлений: 3)
Ответ на: комментарий от Deleted

Но зачем?

Например, если чистая внешняя функция возвращает указатель на результат. Приходится писать что-то вроде

fooBar :: Bar -> Bar
fooBar bar = unsafePerformIO $ with bar $ \barPtr -> do
    ffi_foo barPtr
    peek barPtr

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.