Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    Sophie
    @sofelvpopel
    Есть кто живой?
    нужна помощь в разборе задачи по хаскелю
    nponeccop
    @nponeccop
    вы спрашивайте а мы как оживём ответим
    Sophie
    @sofelvpopel
    как работает writeArray ?
    и newListArray
    Yuriy Syrovetskiy
    @cblp
    для массивов лучше использовать пакет vector
    они работают именно так, как написано в документации
    что именно непонятно?
    nponeccop
    @nponeccop
    Ну если "разбор задачи" то наверняка надо использовать то, что указано в условии
    main = do
       arr <- newArray 0 (0, 99)
       writeArray arr 3 10
       print arr
    Использовать как-то так
    newArray создает массив, а writeArray изменяет элемент. Но это всё есть в документации. В-общем, уточяйте
    Danil Berestov
    @GooseDB
    Объясните, пожалуйста, как по-человечески ловить исключения io. Всё, что я видел в статьях и учебниках выглядит как-то странно и несерьёзно. Конкретный пример: в библиотеке wreq есть функция get. Вот как мне поймать исключения её вызова? Я не нашёл даже то, КАКИЕ исключения она может бросить. Как с этим жить, где искать?
    nponeccop
    @nponeccop

    http://www.serpentine.com/wreq/tutorial.html раздел Error handling

    искать как правило в исходных текстах, в этот раз повезло что есть туториал (который впрочем может оказаться устаревшим)

    Как с этим жить? Считать, что все используемые либы ты принимаешь на поддержку. И слать багрепорты/pr а то и поддерживать форк
    nponeccop
    @nponeccop
    TLDR: бросает HttpException, ловить с помощью Control.Exception.catch
    Yuriy Syrovetskiy
    @cblp
    в телеграме уже посоветовали перейти на req
    а также выяснили, что вопрошающему не надо различать исключения
    nponeccop
    @nponeccop

    в телеграме уже посоветовали перейти на req

    Ну мне такие советы не нравятся, напоминает бессмертное :)

    Если что-то не работает в дистрибутиве X – то это неправильный дистрибутив, надо просто докупить правильный дистрибутив Y. Так как дистрибутивов в линуксе как у дурака фантиков, то процесс ограничен вторым законом термодинамики и возрастом Галактики. Разбираться в проблеме не нужно, т.к. в линуксе всё идеально и само работает – надо просто неправильное заменить на правильное.

    Ну только s/линукс/x-ь/g
    Andrei Dziahel
    @develop7
    это в той серии, где у вопрошающего не было кода почти совсем и в принципе было пофиг, чем именно пользоваться?
    nponeccop
    @nponeccop
    я не сначала сериал смотреть начал :)
    Yuriy Syrovetskiy
    @cblp
    просто req чуть лучше поддерживается, чуть проще для новичка, и лучше задокументирован, в частности, в том, что касается выбрасываемых исключений
    nponeccop
    @nponeccop
    ясно
    oofp
    @oofp

    Например есть простой АДТ: data RGB =R | G | B deriving Enum

    Есть ли возможность derive type level лист: type RGBList = '[R,G,B] или надо каждый раз руками? Спасибо

    Вероятно что то есть что использует TH?
    Yuriy Syrovetskiy
    @cblp
    для простого АТД проще руками
    на TH написать несложно, готового, кажется, нет
    oofp
    @oofp
    @cblp руками будет 'error prone'. тут посоветовали promoteEnumInstances from singletons
    попробую разобраться
    Yuriy Syrovetskiy
    @cblp
    error prone, если у вас много таких
    Paul Khuzhin
    @Paul1298
    Здравствуйте. Не подскажете, как, используя stack на ubuntu 19.04, сделать кросс-платформенный испольняемый файл?
    Yuriy Syrovetskiy
    @cblp
    см. ../forall
    nponeccop
    @nponeccop

    Привет! Тут возник вопрос, почему

    readArray :: (MArray a e m, Ix i) => a i e -> i -> m e

    а не

    readArray :: (MArray a e m, Ix i) => m (a i e -> i -> e)
    Yuriy Syrovetskiy
    @cblp
    кодирование эффектов стрелками Кляйсли a -> m b работает, а второе, скорей всего, нет
    в первой записи очевидно, что эффект m зависит от индекса i на уровне значений, но от типа не зависит
    nponeccop
    @nponeccop
    Можно написать функцию из второго в первое, но не наоборот, то есть второе более универсальное. В качестве причины выбора первого мне приходит в голову только удобство работы с liftA2 и некий дебилизм конструирования чистых функций. Кроме того в первом случае у нас код первого порядка, то есть не содержит ФВП, а во втором содержит.
    Yuriy Syrovetskiy
    @cblp
    более универсальное = менее выразительное?

    написать функцию из второго в первое

    правда? напишите

    nponeccop
    @nponeccop
    более универсальное = имея второй интерфейс можно реализовать первый
    nponeccop
    @nponeccop
    foo :: Monad m => m (a -> b) -> a -> m b
    foo mf a  = do
       f <- mf
       return $ f a
    nponeccop
    @nponeccop

    Для обратного есть контрпример в случае Maybe:

    quux :: (a -> Maybe b) -> Maybe (a -> b)

    Это функция, проверяющая другую функцию на тотальность, чего нельзя сделать из-за того что это эквивалентно задаче останова

    Ну и по более приземлённым причинам нельзя
    nponeccop
    @nponeccop
    (ну и не считая вырожденного случая const Nothing)
    Yuriy Syrovetskiy
    @cblp
    вы в do-нотации неявно использовали (>>=) :: m a -> (a -> m b) -> m b, то есть первую нотацию, так что не считается

    более универсальное = имея второй интерфейс можно реализовать первый

    вот и я об этом же. только это не интерфейс, а представление. из первого не получается второй, потому что в первом больше полезной информации

    nponeccop
    @nponeccop
    Не, речь не идет о том чтобы полностью заменить везде a -> m b на m (a -> b). Речь конкретно о readArray. Имея монады, то есть композицию и юнит для a -> m b, можно сделать любую из двух сигнатур, см. моё первое сообщение с двумя сигнатурами readArray, но выбрали первую сигнатуру . Вопрос почему. И не поломается ли что-то (например, какие-то инварианты или производительность или удобство) в библиотеке массивов , если использовать второй.
    Yuriy Syrovetskiy
    @cblp
    а, в таком контексте. для конкретной задачи первая сигнатура выглядит проще и удобнее, потому что её можно частично применить в чистом контексте
    по-моему, readArray :: (MArray a e m, Ix i) => m (a i e -> i -> e) вообще невозможно реализовать. некое действие должно сконструировать чистую функцию, которая вернёт e для любого i и любого массива? а если индекс выходит за границы массива?
    ладно, выход за границы, возможно, запрещён по конструкции этим a i e
    но что делать, если в два вызова этой чистой функции подсунуть один массив в разные моменты времени? или детерминированность нарушится, или мы получим не то значение из массива