LINUX.ORG.RU

165
Всего сообщений: 404

haskell: (&)

Я так и не понял. Добавили его в ghc или нет?
Мне ghci пишет - Variable not in scope: (&)
Версия - GHCi, version 8.6.5
Prelude стоит.

 ,

n1rdeks ()

Как в xmonad поменять местами активное окно с окном на другом workspace?

Приветствую всех.

Собственно сабж.

Есть workspace. На нём открыта одна программа.

Активным является другой workspace, в нём активна другая программа.

Нужна фукция, которая меняет их местами.

Наверняка, кто-нибудь уже писал подобное.

Поделитесь наработками или подскажите как написать.

 ,

pol01 ()

Как редактировать xmonad.hs в intellij ?

Приветствую всех.

Хочу редактировать файл настройки xmonad в intellij, чтобы были доступны автодополнение, навигация по коду, документация и остальные фичи idea.

Кто подскажет как это сделать правильно?

 , ,

pol01 ()

про то, как видеть C++

Ещё не выздоровел до конца после темы с воспалением легких и легко устаю, и вот посреди одного доклада по C++ на конференции я натурально уснул, и во сне приснилось удивительное.

Проснувшись я стал смотреть на синтаксис C++ и видеть его сквозь призму того, что читал о Haskell (никогда не программировал на нём, а только писал хэлловорлды), и своего небольшого опыта со Scala - всякие scalaz, cats, итп.

Если в глазах иметь своеобразный фотошоп, который выбрасывает из синтаксиса C++ __Уродливые_Идентификаторы и [квадратно](гнездовые) -> конструкции, то на поверхность проступает красота и логичность происходящего. Ты видишь аппликативные функторы и произростающие из них монады, которые просто томятся в застенках из покосившехся скобочкек и отсутствия базовых вещей вроде каррирования.

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

Есть подозрение, что разработчики стандарта это понимают, принимают C++ как язык общего назначения (а не только для написания низкоуровневых системых вещей), и улучшают синтаксис и стандартную библиотеку с целью минимизации в необходимости этого выверта восприятия. Вполне возможно, через десяток лет на C++ будет так же просто писать, как на Haskell или Python. А сейчас придётся ну, самостоятельно заниматься расширением сознания

Подскажите, верно ли моё восприятие? Как двигаться в этом направлении? Нужно ли мне углубляться в Haskell параллельно с изучением C++?

 , ,

stevejobs ()

Включение-отключение полноэкранного режима в XMonad

Есть проблема: желание сделать переход в полноэкранный режим и обратно по нажатию некоторой комбинации клавиш.

Все было бы очень просто, и две строчки в xmonad.hs все решали бы

((modMask, xK_f), withFocused $ windows . (\w -> W.float w (W.RationalRect 0 0 1 1))),
((modMask .|. shiftMask), xK_f), withFocused $ windows . W.sink)
, вот только они задействуют разные комбинации клавиш, а мне хотелось бы свести к одной. Пока что идей немного, можно было бы сделать какой-то селектор, наподобие
((modMask, xK_f), withFocused $ windows . (if isFullscreen then W.sink else (\w -> W.float w (W.RationalRect 0 0 1 1))))
, однако isFullscreen обладает иной сигнатурой и, как я понял, предназначена для использования в ManageHook.

Итак, как это сделать? Я лишь вкатываюсь в XMonad, и знания Haskell несколько поверхностны, да.

 , ,

Siborgium ()

Как в Haskell получить значение из предыдущего цикла?

Простейший пример

main = do
  refval = newIORef 0
  forever $ do
    line <- getLine
    let newval = read line :: Int
    val <- readIORef refval
    writeIORef refval newval
    putStrLn $ show $ newval-val

Как-то можно обойтись без IORef?

 

monk ()

Если в вашем дистрибутиве нет ghc, то забудьте про дефолтное получение манов свежего youtube-dl

Сабж. Авторы youtube-dl теперь используют pandoc для получения этих самых манов. И если pandoc отсутствует в системе, то дефолтная сборка засыпется на

chmod a+x youtube-dl
/bin/sh: pandoc: команда не найдена
/bin/sh: line 0: [: =: ожидается использование унарного оператора
/usr/bin/env python devscripts/prepare_manpage.py youtube-dl.1.temp.md
pandoc -s -f markdown -t man youtube-dl.1.temp.md -o youtube-dl.1
make: pandoc: Команда не найдена
Makefile:91: ошибка выполнения рецепта для цели «youtube-dl.1»
pandoc же написан на Haskell'е и требует кучу соответствующих библиотек. Так что, без ghc здесь никак. Либо прописывать вместо pandoc нечто альтернативное, либо пытаться обходиться без манов вообще.

UPD. Хех. Выясняется, что авторы youtube-dl выкладывают две разных версии тарболов. Если скачать тарбол с https://rg3.github.io/youtube-dl/download.html , то он спокойно опакетится и без pandoc. А вот если скачать тарбол с https://github.com/rg3/youtube-dl/releases , то тут уже понадобится pandoc. Или костыли.

(Кстати, сегодня вышла версия 2018.12.09).

 , , , ,

saahriktu ()

Progect Euler 11 problem

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

*WhoeMeal> problem_11
9171350956890128384
Получаю это число, но оно не подходит. ВОТ ВОТ КОД:
toDigitMatrix :: [[Int]]
toDigitMatrix = map (map read . words) $ lines linxMatrix
    where 
        linxMatrix = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08\n49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00\n81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65\n52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91\n22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80\n24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50\n32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70\n67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21\n24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72\n21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95\n78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92\n16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57\n86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58\n19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40\n04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66\n88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69\n04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36\n20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16\n20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54\n01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48"


diagonals matrix = map (map (\(x,y) -> matrix !! x !! y)) points
    where
        points                      = map ( takeWhile isValidPoint . iterate addOneToTuple) maxRowAndColPoints
        (maxRow, maxCol)            = (length matrix, length (head matrix))
        addOneToTuple (x,y)         = (x+1, y+1)
        maxRowAndColPoints          = zip [0 .. maxRow-1] (repeat 0) ++ zip (repeat 0) [1 .. maxCol-1]
        isValidPoint (start, end) = ((start >= 0) && (start < maxRow)) && ((end >= 0) && (end < maxCol))

problem_11 = maximum $ (map (\row -> maximum (map product . (take 4). tails $ row))) allInOne
    where
        allInOne = diagonals toDigitMatrix ++ toDigitMatrix ++ transpose toDigitMatrix

 ,

kevlik ()

Как начинать изучать функциональное программирование?

Что то захотелось поучить Haskell или чего еще в этом духе, но что взять в качестве учебного материала? в 2018 то.

haskell если возьму то станет первым моим ЯП. До этого лишь максимум калькуляторы на плюсах и шарпах и простейшие конструкции на Паскале. Стоит ли вообще или лучше к нему прийти после года на других ЯП (к примеру) Ruby, C, или Python?

Деньги нужны будут только через 2 года(мне 16) так что думаю пока могу глянуть на языки. (или стоит набивать двухлетний опыт на одном лишь питоне?)

 

StepanKirdin ()

cpp_stm_free: монадическая STM библиотека для параллельного программирования

Привет,

Меня зовут Александр Гранин, и я рад представить вам свою библиотеку для Software Transactional Memory.

Software Transactional Memory (STM, программная транзакционная память) - подход к программированию многопоточных приложений с конкурентно изменяемой моделью данных. STM значительно облегчает создание многопоточного кода, так как не нужно (почти) ломать голову над синхронизацией, data races и валидностью данных. Также STM снижает риск наступить на типичные проблемы параллельного программирования: блокировки, голодание, нетривиальные многопоточные баги. STM позволяет создать две модели: безопасную конкурентную модель данных и транзакционную модель изменения этих данных.

Для С++ существует несколько STM разной степени годности: Wyatt-STM (хорошая), пропозал TS 19841:2015 (плохой), и вот теперь я создал свою библиотеку, которая называется cpp_stm_free.

Библиотека построена на продвинутых идеях из мира ФП (Free-монады, алгебраические типы данных, и др.), и имеет монадический интерфейс. Иными словами, используя эту библиотеку, вы будете писать ФП-код. Библиотека повторяет интерфейс таковой STM в Haskell: транзакции - это монадические комбинаторы в монаде STML, работающие над транзакционными переменными (TVar).

Библиотека может быть полезна в разных сценариях.

  • В серверных приложениях, обрабатывающих входящие и исходящие сообщения.
  • В soft-realtime многопоточных играх.
  • Для моделирования асинхронных вычислений.

Текущая версия библиотеки - v0.5.5. Требует GCC 7.2 и C++17 (и qmake; вскоре заменю на cmake или что-нибудь другое).

Буквально на днях я провел первый раунд оптимизаций и рефакторинга, увеличив производительность изначальной версии на 200% и добавив большое количество комбинаторов.

Для библиотеки имеется два движка, оба построены на Free монадах. Первый - Scott encoded Free monad (медленный), второй - Church encoded Free monad (быстрый). Для понимания: элементарные транзакции над простой моделью выполняются за <0.01 ms, сложные транзакции <0.1 ms, сложные транзакции в многопоточной среде <1 ms.

Более подробно с библиотекой можно ознакомиться в следующих материалах:

В качестве демонстрационного приложения я решил задачу «обедающих философов» (код здесь), и она работает хорошо. Пример транзакций для взятия ложек:

stm::STML<Unit> takeFork(const TFork& tFork) {
    return stm::withTVar<Fork, stm::Unit>(tFork, [=](const Fork& fork) {
       if (fork.state == ForkState::Free) {
           return stm::modifyTVar<Fork>(tFork, setForkTaken);
       }
       else {
           return stm::retry<stm::Unit>();
       }
    });
}

stm::STML<stm::Unit> takeForks(const TForkPair& forks) {
    stm::STML<stm::Unit> lm = takeFork(forks.left);
    stm::STML<stm::Unit> rm = takeFork(forks.right);
    return stm::sequence(lm, rm);
}

Продолжаю развивать библиотеку, на очереди - еще один раунд оптимизаций и добавление новых фич.

Буду рад ответить на вопросы.

 , , ,

GraninAS ()

А где старые хаскелисты и лисперы?

Лавсан, квасимото, mv, jtootf, архимаг и прочие.
Сменилось поколение?
Им все надоело и они теперь питонят за еду?
Такие хорошие познавательные треды были по ЯП.

 , , ,

bga_ ()

Принцип работы seq

Имеется два выражения:

seq ((\True y -> «AAA») undefined) 42

seq ((\True -> \y -> «AAA») undefined) 42

Первый даст «42», второй — расходимость. Помогите разобраться, почему во втором случае имеется расходимость? Ведь мы можем из второго варианта получить первый, так как (\True y -> ...) == (\True -> (\y -> ...)).

 

glycine ()

Листы в Haskell

Добрый день! Помогите, пожалуйста, разобраться, как что происходит при выполнении следующих операций (справа указан результат операции):

1) [x]:[] = [[x]]

2) [x]:[y] = ERROR

3) [x]:[[y]] = [[x],[y]]

Почему первая операция дает нам двумерный список, а вторая выдает ошибку (а не двумерный список)? И как понимать 3) операцию?

 

glycine ()

Haskell, зачем он сейчас? Как состояние ФП?

Всем привет. Помню как появился Haskell и много стали говорить о промышленном применении ФП.

А где сейчас применяется Haskell? Какого его промышленное применение? Зачем он современному миру, кроме тестирования каких-либо подходов?

То же касательно и других ФП-языков - кто-то полноценно жив?

 , , ,

silver-bullet-bfg ()

Создать либу на Haskell

Вопрос возник по языку Haskell. Допустим, у меня есть множество пакетов. Я хочу собрать это все в одну либу (DLL) статически так, чтобы либа не зависела от того, установлена ли среда Haskell на компьютере пользователя или нет. Максимум, что могу себе позволить - это динамическую компоновку с либой Sqlite3. Цель: дергать свою либу из сишного кода.

Интересуют варианты создания такой либы для версий Windows, Linux и макоси. Все системы важны.

Такое кто-нибудь проделывал? Какие есть подводные камни, кроме тех, что описаны в документации GHC? И нет ли подходящего туториала?

Нашел один туториал [https://www.fpcomplete.com/blog/2016/10/static-compilation-with-stack]. А есть ли еще?

 

dave ()

Вышла версия 0.5.0 утилиты shellcheck для проверки скриптов на bash/sh

Сабж. Утилита написана на haskell'е.

Проект на гитхабе: https://github.com/koalaman/shellcheck
Скачать: https://github.com/koalaman/shellcheck/archive/v0.5.0.tar.gz

 , ,

saahriktu ()

Haskell Platform 8.4.2

Для тех, кто не читает рассылку Haskell Cafe. Вышла новая версия платформы. Не все пакеты еще подтянулись. Например, svg-builder хандрит.

Ох, уж эти любители задавать точные границы для версий пакетов! Никогда их не понимал. Меня самого агитировали, но я отказался.

Спешу успокоить тех, кто далек от Haskell. В stack все работает, как и прежде работало.

 ,

dave ()

Посоветуйте хорошую книгу по Haskell для начинающих.

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

 ,

ITerator ()

Haskell и Foldable

Всем привет.

Познаю хаскель, наткнулся на проблему.

Есть простое дерево с лесом:

data RoseTree a = RoseEmpty | RoseTree a [RoseTree a]                                  
                    deriving (Show,Eq)

Пытаюсь реализовать для него интерфейс тайпкласса Foldable:

instance Foldable RoseTree where                                                       
    foldr _ acc RoseEmpty       = acc                                           
    foldr f acc (RoseTree x []) = f x acc                                       
    foldr f acc (RoseTree x ts) = let mapped    = map (foldr f acc) ts          
                                      folded    = foldr f acc mapped            
                                  in f x folded

Идея простая: чтобы свернуть список поддеревьев, применяю частично примененный (foldr f acc) к списку, получаю вместо списка поддеревьев (RoseTree a) список значений (a), потом сворачиваю список значений и применяю функцию f к значению ноды из паттерна и свернутому значению поддеревьев.

Но получаю ошибку в ghci:

error:
    • Couldn't match type ‘b’ with ‘a’
      ‘b’ is a rigid type variable bound by
        the type signature for:
          foldr :: forall a b. (a -> b -> b) -> b -> RoseTree a -> b
        at lecture11.hs:131:5
      ‘a’ is a rigid type variable bound by
        the type signature for:
          foldr :: forall a b. (a -> b -> b) -> b -> RoseTree a -> b
        at lecture11.hs:131:5
      Expected type: [a]
        Actual type: [b]
    • In the third argument of ‘foldr’, namely ‘mapped’
      In the expression: foldr f acc mapped
      In an equation for ‘folded’: folded = foldr f acc mapped
    • Relevant bindings include
        folded :: b (bound at lecture11.hs:134:39)
        mapped :: [b] (bound at lecture11.hs:133:39)
        ts :: [RoseTree a] (bound at lecture11.hs:133:29)
        x :: a (bound at lecture11.hs:133:27)
        acc :: b (bound at lecture11.hs:133:13)
        f :: a -> b -> b (bound at lecture11.hs:133:11)

Насколько я понимаю, ругань на то, что частично примененный (foldr f acc) получает на вход список не того типа. Но не могу понять почему, ведь этот foldr есть мой рекурсивный вызов и по идее он должен выглядеть так:

map (foldr f acc) ts

или для примера

map (foldr (+) 0) [RoseTree 1 [], RoseTree 2 [], RoseTree 3 []]

т.е.

[foldr (+) 0 (RoseTree 1 []), foldr (+) 0 (RoseTree 2 []), foldr (+) 0 (RoseTree 3 [])]

и по одной из моих реализаций Foldable RoseTree, где

foldr f acc (RoseTree x []) = f x acc

, получаем [1, 2, 3], что подтверждается пошаговым биндингом этого кода в ghci, но вот целиком ghci мой Foldable не проглатывает.

В чем проблема, парни?

 ,

WaterLine ()

Yesod кто-нибудь в проде использует?

Интересует в качестве RESTful сервиса. Как с нагрузкой? Стоит ли вкладываться? Истории успеха?

Спасибо!

 , ,

mimimimi ()