hGetContents реализована через функцию с говорящим названием unsafeInterleaveIO, потому она таит в себе опасность
Т.е. с если смотреть на идеологическую сторону вопроса — нечего использовать unsafe функции.
Работать со строками через String не совсем принято, надо использовать text, а там есть как строгий readFile, так и ленивый.
И в ByteString есть тоже две версии.
Если мы читаем бинарные данные, надо использовать ByteString, если текстовые, то встаёт вопрос кодировки, и тут нужен ByteString+Text.
1. При использовании hGetContents файл закрывать не надо, он закроется сам, когда дочитается до конца, либо когда не останется ссылок.
2. Если вам надо прочесть и закрыть, используйте withFile и строгие функции чтения данных
3. "«заставить» Haskell вычислить переменную content до закрытия файла (если кто-то знает способ, напишите)"
Пишу:
length content `seq` do ...
в данном случае будет достаточно, так как для вычисления длины списка, придётся этот список заполнить.
seq вычисляет первый аргумент до WHNF, т.е., грубо говоря, до конструктора, аргументы конструктора не трогает. Поэтому если вычислить seq (Just undefined) 10, результат будет просто 10, без ошибки, так как то, что внутри — не трогается.
Если надо форсировать вычисление до конца, то можно использовать deepseq/force из Control.DeepSeq: (Just undefined) `deepseq` 10 === undefined.
Не хватает ещё одного пункта: теперь менеджер просит 5 членов команды добавить по 2 печи и по 4 рецепта.
Слева картинка разрастается, справа нет, но тут какой-то подвох.
Чтобы жить сейчас, кредит брать не обязательно. У вас какие-то сильно разные Вася и Петя, подгоняемые под результат «быть Васей хуже, чем быть Петей».
Есть множество историй, как люди ужимались-ужимались, а там глядь, молодость ушла, с друзьями уже не потусишь, интересы уже не те, порой и личную жизнь забывают устроить. И остаётся человек наедине со своими деньгами.
Подходил белый к негру, лежащему под пальмой:
— Что ты лежишь?
— А что?
— Ну взял бы, сорвал бананов, продал
— Зачем?
— Купил бы тачку, собрал бы ещё больше, продал
— Зачем?
— Нанял бы людей, они бы собирали, а ты б лежал и ничего не далал
— А я и так лежу
Если Вася по способностям сопоставим с Петей, то под сокращение не попадёт. Живёт и не напрягается уже сейчас.
Смысла же сравнивать с неравным соперником нет. Понятно, что лучше быть богатым и здоровым, чем бедным и больным.
Всё это напоминает анекдот:
Подходил белый к негру, лежащему под пальмой:
— Что ты лежишь?
— А что?
Если, к примеру, пишут «стоянка в ВС запрещена» автоматически подразумевается, что она разрешена в остальные дни, хотя казалось бы. Кстати, именно о такой ситуации говорят «исключение подтверждает правило», которая звучит полностью как «исключение подтверждает правило в неисключенных ситуациях».
trikadin говорит о том, что из-за позиционирования себя как лучших, люди обращают избыточное внимание на их баги. Если они не хотят такого избыточного внимания, значит не должны позиционировать как лучшие.
Он не говорит про 0% багов, он говорит про то, что на небольшой процент багов будет избыточное внимание.
Т.е. с если смотреть на идеологическую сторону вопроса — нечего использовать unsafe функции.
И в ByteString есть тоже две версии.
Если мы читаем бинарные данные, надо использовать ByteString, если текстовые, то встаёт вопрос кодировки, и тут нужен ByteString+Text.
String — это на коленке наваять и посмотреть.
2. Если вам надо прочесть и закрыть, используйте withFile и строгие функции чтения данных
3. "«заставить» Haskell вычислить переменную content до закрытия файла (если кто-то знает способ, напишите)"
Пишу:
в данном случае будет достаточно, так как для вычисления длины списка, придётся этот список заполнить.
seq вычисляет первый аргумент до WHNF, т.е., грубо говоря, до конструктора, аргументы конструктора не трогает. Поэтому если вычислить seq (Just undefined) 10, результат будет просто 10, без ошибки, так как то, что внутри — не трогается.
Если надо форсировать вычисление до конца, то можно использовать deepseq/force из Control.DeepSeq: (Just undefined) `deepseq` 10 === undefined.
Слева картинка разрастается, справа нет, но тут какой-то подвох.
Есть множество историй, как люди ужимались-ужимались, а там глядь, молодость ушла, с друзьями уже не потусишь, интересы уже не те, порой и личную жизнь забывают устроить. И остаётся человек наедине со своими деньгами.
Подходил белый к негру, лежащему под пальмой:
— Что ты лежишь?
— А что?
— Ну взял бы, сорвал бананов, продал
— Зачем?
— Купил бы тачку, собрал бы ещё больше, продал
— Зачем?
— Нанял бы людей, они бы собирали, а ты б лежал и ничего не далал
— А я и так лежу
Смысла же сравнивать с неравным соперником нет. Понятно, что лучше быть богатым и здоровым, чем бедным и больным.
Всё это напоминает анекдот:
Подходил белый к негру, лежащему под пальмой:
— Что ты лежишь?
— А что?
Вы не телепат, поэтому не поняли.
Вы хотите сказать, что я телепат?
Если, к примеру, пишут «стоянка в ВС запрещена» автоматически подразумевается, что она разрешена в остальные дни, хотя казалось бы. Кстати, именно о такой ситуации говорят «исключение подтверждает правило», которая звучит полностью как «исключение подтверждает правило в неисключенных ситуациях».
Он не говорит про 0% багов, он говорит про то, что на небольшой процент багов будет избыточное внимание.
output: ok!
liveworkspace.org/code/123aa4598c57ec541046f61bc844de20
Вот тут есть разыменование. Обращения по нулевому адресу не происходит, да, но разыменование есть.