1675
https://combot.org/chat/-1001043143583 Ссылки на полезные ресурсы: https://ruhaskell.org/links.html ; Информация о мероприятиях: https://gist.github.com/qnikst/a96cac661be80d126d0829f2ced1916e
парсер регекспов из тайплевельного Symbol я иду к тебе муахахаха
Читать полностью…
В GHC N-ное количество релизов назад добавили возможность матчить строки на тайплевеле. А значит теперь можно сделать тайпсефный printf. По факту конечно матчинг там ненастоящий, он реализован через магическую type family, которая распиливает Symbol на башку и хвост. Из-за этого проиходится немного пердолиться с прокси тайп фемили.
Настоящий printf с форматированием чисел мне не очень интересен с практической точки зрения. Но попробовать его сделать наверное попробую попозже. Сейчас накидал просто штуку, которая вытскивает из строчки имена и строит функцию, ожидающую именованные аргументы:
> :t format @"User with ID #userId has initiated #txn"Arg это просто именованная обёртка:
:: Arg "userId" -> Arg "txn" -> Data.Text.Internal.Builder.Builder
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
Я за тайплевельный эксгибиционизм, пусть все видят какие у нас красивые рекурсивные тайпфемили
Читать полностью…
Эхх, а тип-то и не показали как Symbol в тайплевеле парсить
Читать полностью…
Можно спрятать все мясо в скрипт/программу:
https://gist.github.com/igor-ramazanov/7bd29ac9be57e14b9672204dba0e3075
если сохранить и исполнить, то он сбилдит сам себя в нестатический бинарь с /nix/store зависимостями
Читать полностью…
увы, этот баг сильно ограничивает использование nix bundle в shebang
https://github.com/NixOS/nix/issues/2678#issuecomment-3145730453
сложно, но не невозможно, за пять минут не решишь такое
как я понял, идея в том, чтобы:
1. есть скрипт, который выплевывает сам себя в виде скомпилированного бинарника
2. код для сборки на никсе в этом же скрипте в shebang
далее развилка и один неотвеченный вопрос:
- вариант 1) собрать бинарь с shared libraries зависимостями как обычно, далее извлечь nix closure и собрать через nix bundle
- вариант 2) скомпилить в полностью статический бинарь через https://github.com/nh2/static-haskell-nix
что непонятно в силу моей слабой экспертизы в хаскелле: как создать рабочее окружение с версией компилятора и библиотеками для скрипта
но уверен, что, если сильно постараться, то можно
правда недавно пришлось руками дописать jwt аутентификацию шоб работала генерация опенапи
Читать полностью…
В общем задача достаточно тривиальная чтоб для того, кто умеет в хаскель тайплевел, хватило указания на анконс тайпфемили
Читать полностью…
Ну она цельная, ты вызываешь на нём тайпфемили, которая даёт мейби (голова, хвост)
Читать полностью…
я думал Symbol это цельная бандурина а тут вот оно как, спасибо!
Читать полностью…
с этим разобрался - при переходе forall ./-> переменная типа становится обычной
Читать полностью…
"Не извиняйся. СПЖ учил нас не стесняться наших type arguments, особенно если они такие required"
😐
Type-level аргумент становится явным и его предъявление требуется всегда. Или я не понял вопрос?
Читать полностью…
версия компилятора и библиотеки указаны в конце шебанга
Читать полностью…
в общем, получилось такое мясо:
#!/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>"]
для nix bundle нужен CAP_SYS_USER_NS. Написал похожий пакер и наглое переписывание /nix/store на /tmp/uuid5 (symlink) sedом в сошках прокатило даже в макос
Читать полностью…
как этот ваш HostPreference из Warp нормально показывать в логах?
Читать полностью…