<html><head></head><body><div style="color:#000; background-color:#fff; font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif;font-size:10px"><div id="yiv4088300129"><div id="yui_3_16_0_ym19_1_1461746915484_14169"><div id="yui_3_16_0_ym19_1_1461746915484_14168" style="color:#000;background-color:#fff;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif;font-size:10px;"><font id="yui_3_16_0_ym19_1_1461746915484_14381" size="3">Какой снобизм? Просто непонимание, почему, если без unsafePerformIO никуда, говорят о чистоте.<br id="yui_3_16_0_ym19_1_1461746915484_14247"><br id="yui_3_16_0_ym19_1_1461746915484_14248">readFile говорите?<br id="yui_3_16_0_ym19_1_1461746915484_14249"><br id="yui_3_16_0_ym19_1_1461746915484_14250">Открываем исходники bytestring-0.10.6.0 и видим.<br id="yui_3_16_0_ym19_1_1461746915484_14251"><br id="yui_3_16_0_ym19_1_1461746915484_14252"><br id="yui_3_16_0_ym19_1_1461746915484_14253">hGetContentsN :: Int -> Handle -> IO ByteString<br id="yui_3_16_0_ym19_1_1461746915484_14254">hGetContentsN k h = lazyRead -- TODO close on exceptions<br id="yui_3_16_0_ym19_1_1461746915484_14255">  where<br id="yui_3_16_0_ym19_1_1461746915484_14256">    lazyRead = unsafeInterleaveIO loop<br id="yui_3_16_0_ym19_1_1461746915484_14257"><br id="yui_3_16_0_ym19_1_1461746915484_14258">    loop = do<br id="yui_3_16_0_ym19_1_1461746915484_14259">        c <- S.hGetSome h k -- only blocks if there is no data available<br id="yui_3_16_0_ym19_1_1461746915484_14260">        if S.null c<br id="yui_3_16_0_ym19_1_1461746915484_14261">          then do hClose h >> return Empty<br id="yui_3_16_0_ym19_1_1461746915484_14262">          else do cs <- lazyRead<br id="yui_3_16_0_ym19_1_1461746915484_14263">                  return (Chunk c cs)<br id="yui_3_16_0_ym19_1_1461746915484_14264"><br id="yui_3_16_0_ym19_1_1461746915484_14265">Есть и unsafeInterleaveIO, и даже комментарий есть.<br id="yui_3_16_0_ym19_1_1461746915484_14266"><br id="yui_3_16_0_ym19_1_1461746915484_14267">А когда может прилететь exceptions? Когда чистой функции md5 потребуется следующая порция данных. В чистой функции exceptions. Это как?<br id="yui_3_16_0_ym19_1_1461746915484_14268">Или считать, что exceptions в fmap, bind происходят?<br id="yui_3_16_0_ym19_1_1461746915484_14269"><br id="yui_3_16_0_ym19_1_1461746915484_14270">Хотя, если считать, что отсутствие результата - это не результат, то да Haskell - чистый. А так он "Best Imperative Language", в котором для IO сделали красивую обертку.<br id="yui_3_16_0_ym19_1_1461746915484_14271"><br id="yui_3_16_0_ym19_1_1461746915484_14272"><br id="yui_3_16_0_ym19_1_1461746915484_14273">P.S.<br id="yui_3_16_0_ym19_1_1461746915484_14274">Что почитать посоветуете?</font><br id="yui_3_16_0_ym19_1_1461746915484_14275"><div id="yui_3_16_0_ym19_1_1461746915484_14279" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1461746915484_14183" class="yiv4088300129qtdSeparateBR"><br clear="none"></div></div></div></div><div class=".yiv4088300129yahoo_quoted"> <div style="font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif;font-size:10px;"> <div style="font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif;font-size:16px;"> <div class="qtdSeparateBR"><br><br></div><div class="yiv4088300129yqt6855711081" id="yiv4088300129yqt90546"><div dir="ltr"><font face="Arial" size="2"> On Wednesday, 27 April 2016, 11:26, Alexander Q <qalexx@gmail.com> wrote:<br clear="none"></font></div>  <br clear="none"><br clear="none"> <div class="yiv4088300129y_msg_container"><div id="yiv4088300129"><div><div dir="ltr">за unsafePerformIO по такому поводу — билет на хедхантер в одну сторону, мне кажется.<div><br clear="none"></div><div>Если md5 чистая функция Bytestring -> Bytestring, и у нас есть IO Bytestring какой-нибудь (readFile там), то мы делаем очевидный ход</div><div>fmap md5 (readFile path)</div><div>и вот смотри ка, даже упёртому должно быть понятно, что у нас</div><div>а) отделение IO от чистой логики</div><div>б) ровно то, что хочется на входе и выходе</div><div><br clear="none"></div><div>Для перемножения матриц я рекомендую использовать unboxed вектора из библиотеки <a rel="nofollow" shape="rect" target="_blank" href="https://hackage.haskell.org/package/vector">vector</a>.</div><div><br clear="none"></div><div>А ещё я предлагаю засунуть свой снобизм туда же, где ваши знания про функциональное программирование, и почитать <a rel="nofollow" shape="rect" target="_blank" href="https://wiki.haskell.org/IO_inside">хоть что нибудь</a> уже. Вот даже цитату принёс:</div><div>> Haskell is a pure language, which means that the result of any function call is fully determined by its arguments.</div></div><br clear="none"><div class="yiv4088300129gmail_quote"><div class="yiv4088300129yqt0446150081" id="yiv4088300129yqtfd90945"><div dir="ltr">On Wed, Apr 27, 2016 at 9:47 AM ksvs <<a rel="nofollow" shape="rect" ymailto="mailto:ksvs1996@ymail.com" target="_blank" href="mailto:ksvs1996@ymail.com">ksvs1996@ymail.com</a>> wrote:<br clear="none"></div></div><blockquote class="yiv4088300129gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="yiv4088300129yqt0446150081" id="yiv4088300129yqtfd81118"><div><div style="color:#000;background-color:#fff;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif;font-size:10px;"><br clear="none"><div dir="ltr"><font size="3"><font size="3">unsafePerformIO</font></font></div><div dir="ltr"><font size="3"><font size="3"><br clear="none"></font></font></div><font size="3">md5 - функция принимает на вход ленивую ByteString от файла и выдает Integer.<br clear="none">Чистая функция? Да. А внутри unsafePerformIO. :-)<br clear="none"><br clear="none">Перемножить матрицы для скорости паралельно.<br clear="none">Тип функции :: матрица -> матрица -> матрица<br clear="none">Чистая функция, а внутри forkIO и unsafePerformIO.<br clear="none"><br clear="none"></font><div dir="ltr"><font size="3">От всем хорош haskell, только притворятся чистым языком.</font></div><div dir="ltr"><font size="3"><br clear="none"></font></div><div dir="ltr"><font size="3">:-)<br clear="none"></font></div></div></div></div><div><div style="color:#000;background-color:#fff;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif;font-size:10px;"><div class="yiv4088300129yqt0446150081" id="yiv4088300129yqtfd71457"><div dir="ltr"><div dir="ltr"><br clear="none"></div></div><div><span></span></div> <div><br clear="none"><br clear="none"></div></div><div style="display:block;"><div class="yiv4088300129yqt0446150081" id="yiv4088300129yqtfd51642"> </div><div style="font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif;font-size:10px;"><div class="yiv4088300129yqt0446150081" id="yiv4088300129yqtfd13064"> </div><div style="font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, Sans-Serif;font-size:16px;"><div class="yiv4088300129yqt0446150081" id="yiv4088300129yqtfd12178"> <div dir="ltr"><font face="Arial" size="2"> On Tuesday, 26 April 2016, 16:59, Alexander Q <<a rel="nofollow" shape="rect" ymailto="mailto:qalexx@gmail.com" target="_blank" href="mailto:qalexx@gmail.com">qalexx@gmail.com</a>> wrote:<br clear="none"></font></div>  <br clear="none"> <div><div><div dir="ltr">> На ум приходит посчитать md5, но а если файла, то его целиком читать в память  не оптимально, то это уже кондуиды, и на каждую порцию получаем IO в алгоритме.<div><span style="line-height:1.5;"><br clear="none"></span></div><div><span style="line-height:1.5;">Отличное условие. Посчитать функцию от (IO a) без IO? Будьте добры, спойте "ёлочку", не набирая воздух в течение получаса.</span></div></div></div></div></div>  </div> </div>  </div></div></div>--<br clear="none">
Moscow.pm mailing list<br clear="none">
<a rel="nofollow" shape="rect" ymailto="mailto:moscow-pm@pm.org" target="_blank" href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a rel="nofollow" shape="rect" target="_blank" href="http://moscow.pm.org/">http://moscow.pm.org</a><div class="yiv4088300129yqt0446150081" id="yiv4088300129yqtfd87790"><br clear="none">
</div></blockquote></div><div class="yiv4088300129yqt0446150081" id="yiv4088300129yqtfd30090">
</div></div></div><br clear="none">-- <br clear="none">Moscow.pm mailing list<br clear="none"><a rel="nofollow" shape="rect" ymailto="mailto:moscow-pm@pm.org" target="_blank" href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a rel="nofollow" shape="rect" target="_blank" href="http://moscow.pm.org/">http://moscow.pm.org</a><div class="yiv4088300129yqt0446150081" id="yiv4088300129yqtfd44816"><br clear="none"></div><br clear="none"><br clear="none"></div></div>  </div> </div>  </div></div></body></html>