haskellru | Unsorted

Telegram-канал haskellru - Haskell

1675

https://combot.org/chat/-1001043143583 Ссылки на полезные ресурсы: https://ruhaskell.org/links.html ; Информация о мероприятиях: https://gist.github.com/qnikst/a96cac661be80d126d0829f2ced1916e

Subscribe to a channel

Haskell

https://hackage.haskell.org/package/symparsec

Читать полностью…

Haskell

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

Читать полностью…

Haskell

дада, так и понял, ага

Читать полностью…

Haskell

парсер регекспов из тайплевельного Symbol я иду к тебе муахахаха

Читать полностью…

Haskell

Так же как бы ты список парсил

Читать полностью…

Haskell

В GHC N-ное количество релизов назад добавили возможность матчить строки на тайплевеле. А значит теперь можно сделать тайпсефный printf. По факту конечно матчинг там ненастоящий, он реализован через магическую type family, которая распиливает Symbol на башку и хвост. Из-за этого проиходится немного пердолиться с прокси тайп фемили.
Настоящий printf с форматированием чисел мне не очень интересен с практической точки зрения. Но попробовать его сделать наверное попробую попозже. Сейчас накидал просто штуку, которая вытскивает из строчки имена и строит функцию, ожидающую именованные аргументы:

> :t format @"User with ID #userId has initiated #txn" 
:: Arg "userId" -> Arg "txn" -> Data.Text.Internal.Builder.Builder
Arg это просто именованная обёртка:
newtype Arg (name :: Symbol) = Arg LazyText.Builder
Но если давать кронструктор Arg в скоуп, то можно перепутать аргументы. Добавляем ещё немного скучного хаскеля:
instance Logged a => IsLabel s (a -> Arg s) where
fromLabel = Arg . logged

> ghci> #char 'a' :: Arg "char"
Arg "'a'"
ghci> #chaaaar 'a' :: Arg "char"

<interactive>:39:1: error:
• No instance for (GHC.OverloadedLabels.IsLabel
"chaaaar" (Char -> Arg "char"))
arising from the overloaded label ‘#chaaaar’
(maybe you haven't applied a function to enough arguments?)
• In the expression: #chaaaar
In the expression: #chaaaar 'a' :: Arg "char"
In an equation for ‘it’: it = #chaaaar 'a' :: Arg "char"

Ошибка компиляции уродская — как обычно — ок
С точки зрения имплементации конечно, если откинуть визуальный мусор — ничего сложного, поэтому просто пример использования и ссылка на гист:
ghci> i = id @Int 
ghci> format @"#a + #b = #c" (#a $ i 1) (#b $ i 2) (#c $ i 1 + 2)
"1 + 2 = 3"

ghci> format @"#a + #b = #c" (#a $ i 1) (#b $ i 2)

<interactive>:48:1: error:
• No instance for (Show
(Arg "c" -> Data.Text.Internal.Builder.Builder))
arising from a use of ‘print’
(maybe you haven't applied a function to enough arguments?)
• In a stmt of an interactive GHCi command: print it
гист
PS. Удивительно кстати, что GH без проблем парсит это месево из тиков

Читать полностью…

Haskell

Там решается тривиально

Читать полностью…

Haskell

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

Читать полностью…

Haskell

Эхх, а тип-то и не показали как Symbol в тайплевеле парсить

Читать полностью…

Haskell

Можно спрятать все мясо в скрипт/программу:

https://gist.github.com/igor-ramazanov/7bd29ac9be57e14b9672204dba0e3075

Читать полностью…

Haskell

если сохранить и исполнить, то он сбилдит сам себя в нестатический бинарь с /nix/store зависимостями

Читать полностью…

Haskell

увы, этот баг сильно ограничивает использование nix bundle в shebang
https://github.com/NixOS/nix/issues/2678#issuecomment-3145730453

Читать полностью…

Haskell

сложно, но не невозможно, за пять минут не решишь такое

как я понял, идея в том, чтобы:
1. есть скрипт, который выплевывает сам себя в виде скомпилированного бинарника
2. код для сборки на никсе в этом же скрипте в shebang

далее развилка и один неотвеченный вопрос:
- вариант 1) собрать бинарь с shared libraries зависимостями как обычно, далее извлечь nix closure и собрать через nix bundle
- вариант 2) скомпилить в полностью статический бинарь через https://github.com/nh2/static-haskell-nix

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

но уверен, что, если сильно постараться, то можно

Читать полностью…

Haskell

это кстати вроде работает, я даже проверял

Читать полностью…

Haskell

правда недавно пришлось руками дописать jwt аутентификацию шоб работала генерация опенапи

Читать полностью…

Haskell

В общем задача достаточно тривиальная чтоб для того, кто умеет в хаскель тайплевел, хватило указания на анконс тайпфемили

Читать полностью…

Haskell

Тайпфемили встроенная

Читать полностью…

Haskell

Ну она цельная, ты вызываешь на нём тайпфемили, которая даёт мейби (голова, хвост)

Читать полностью…

Haskell

я думал Symbol это цельная бандурина а тут вот оно как, спасибо!

Читать полностью…

Haskell

Ну типа обычная рекурсия

Читать полностью…

Haskell

с этим разобрался - при переходе forall ./-> переменная типа становится обычной

Читать полностью…

Haskell

"Не извиняйся. СПЖ учил нас не стесняться наших type arguments, особенно если они такие required"
😐

Читать полностью…

Haskell

потому что такое лучше не показывать

Читать полностью…

Haskell

Type-level аргумент становится явным и его предъявление требуется всегда. Или я не понял вопрос?

Читать полностью…

Haskell

версия компилятора и библиотеки указаны в конце шебанга

Читать полностью…

Haskell

в общем, получилось такое мясо:

#!/usr/bin/env nix
#! nix build --impure
#! nix --expr ``
#! nix {pkgs, script, ghcVersion, deps}: let
#! nix dependencies = hpkgs: builtins.map (dep: hpkgs.${dep}) deps;
#! nix ghc = pkgs.haskell.packages.${ghcVersion}.ghcWithPackages dependencies;
#! nix source = pkgs.writeText "script.hs" script;
#! nix name = "haskell-scripting-scotty-example";
#! nix in
#! nix pkgs.runCommandNoCCLocal name {nativeBuildInputs = [ghc];} ''
#! nix mkdir -p ./.tmp
#! nix ghc \
#! nix -outputdir ./.tmp/ \
#! nix -hidir ./.tmp/ \
#! nix -odir ./.tmp/ \
#! nix -dumpdir ./.tmp/ \
#! nix -tmpdir ./.tmp/ \
#! nix -o ./.tmp/${name} \
#! nix --make ${source}
#! nix mv ./.tmp/${name} $out
#! nix rm -r ./.tmp/
#! nix ''
#! nix ``
#! nix --arg pkgs ``import <nixpkgs> {}``
#! nix --argstr ghcVersion ghc984
#! nix --arg deps ``["base" "scotty"]``
#! nix --arg-from-file script

{-# LANGUAGE OverloadedStrings #-}

import Web.Scotty
import Data.Monoid (mconcat)

main = scotty 3000 $ do
get "/:word" $ do
beam <- param "word"
html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

Читать полностью…

Haskell

для nix bundle нужен CAP_SYS_USER_NS. Написал похожий пакер и наглое переписывание /nix/store на /tmp/uuid5 (symlink) sedом в сошках прокатило даже в макос

Читать полностью…

Haskell

как этот ваш HostPreference из Warp нормально показывать в логах?

Читать полностью…

Haskell

но там было не много

Читать полностью…

Haskell

/channel/haskellru/490189

Читать полностью…
Subscribe to a channel