to post messages and comments.

Алсо недавно обнаружил что у ассоциированных с классом типофамилий могут быть параметры отличные от параметров класса. Жить сразу стало заметно легче.

А кто-нибудь уже написал генератор линз с полиморфным апдейтом на генериках? С мономорфными легко. gist.github.com — вот например вариант, который зажёвывает Proxy t и возвращает линзы в виде гетеросписка. Тут есть несколько решённых и нерешённых проблем (особенно мне нравятся отдельные инстансы для Applicative и для Functor), но в целом речь не об этом. gist.github.com — попытка проделать это же с полиморфными линзами проваливается где-то в районе инстанса для f :*: g. А всё потому что тип полученного произведения типов зависит от того какой «множитель» мы меняем. Где-то на этом месте фантазия моя подиссякла.

а если у меня запускается 20 тысяч тредов с bracket_ (atomically $ incrementCounter1) (atomically $ decrementCounter1 >> incrementCounter2) someShit, и в конце получается counter1 отрицательный, а counter2 равный числу тредов, то это же пиздец? Или есть какие-то объяснения?

gist.github.com — предлагаю небольшую игру. Суть игры в том, что вы будете пытаться доказать мне что реализация легковесных регионов по ссылке неполноценна и надо взять regions, а я буду вносить правки в gist и делать вид что так и было.

ucnv_getMaxCharSize strikes back.

Ставлю text-icu на Windows:
```
stack exec — pacman -Sy mingw64/mingw-w64-x86_64-icu
stack build text-icu
```

После этого, при попытке его использовать:
```
Prelude> import Data.Text.ICU
Prelude Data.Text.ICU> :t Root
Root :: LocaleName
Prelude Data.Text.ICU> Root
ghc.EXE: addDLL: icudt (Win32 error 126): The specified module could not be found.
```

Ок. Нашёл, где лежат dll-ки, положил копии с нужными именами (icudt58.dll -> icudt.dll).
(На всякий случай: инфа о пакетах в <stack_root>\snapshots\<...>\pkgdb\*.conf)
Теперь такая ошибка:
```
Prelude> import Data.Text.ICU
Prelude Data.Text.ICU> Root
ghc.EXE: C:\stack_root\snapshots\61ba18c6\lib\x86_64-windows-ghc-8.0.1\text-icu-0.7.0.1-3ZPlchKHjedDm1t6cAa5us\HStext-icu-0.7.0.1-3ZPlchKHjedDm1t6cAa5us.o: unknown symbol `ucnv_getMaxCharSize_58'

ghc.EXE: unable to load package `text-icu-0.7.0.1'
```

Погуглил. Есть пара похожих случаев. То ли версии icu 57, 58 проблемные, то ли либа text-icu что-то не учитывает.
github.com
Ещё вспомнил про #2885797 .

В итоге скачал icu версии 59, удалил text-icu, переустановил text-icu с указанием путей до этой версии.
```
stack exec — ghc-pkg unregister --force text-icu
stack install text-icu --extra-lib-dirs=C:\...\icu59\bin64 --extra-include-dirs=C:\...\icu59\include
```
Заработало.

Меняем Network.URI на URI.ByteString, regex-tdfa на regex-pcre и получаем ускорение разбора урлов на порядок, с 10 тысяч в секунду до ста тысяч. Хотя сишечке все равно проигрывает в два-три раза, но это уже нормально.

Положим у меня есть тип data T f = T (forall a. f a -> a) и линза вида Lens (f x) (f x) x x, где f — полиморфный контейнер фиксированного размера. Могу я как-нибудь при помощи второго наполнить первое?

А давайте спецолимпиадку по типам? Есть код codegists.com это Freer для стрелок, но с ним проблема, нужно квадратичное число инстансов, так надо определять Category (Freer Category eff), Category (Freer Arrow eff), несмотря на то, что Category => Arrow. Что очевидно очень печально, и хотелось бы это поправить.

У меня получилось такое:

gist.github.com

Есть чуть более простые варианты но с тоже с квадратичным числом инстансов, хоть и более простых. Так же можно запилить вариант на TH который будет сразу генерить полный instance search, но это читерство.

Принимаются варианты и предложения по улучшению гиста.

Идиота вопрос. Ниже "псевдокод", который естественно не тайпчекается. Вопрос, как изобразить "нечто аналогичное", что-то вроде isInstanceOf?

```
newtype Name = Name { getName :: Name }
newtype Phone = Phone { getPhone :: Int }

data Selection = Selection Int Int

data PhoneContact = PhoneContact Name Phone
data PhoneWithSelectionContact = PhoneWithSelectionContact Name Phone Selection

class IsContact a

instance IsContact PhoneContact
instance IsContact PhoneWithSelectionContact

filterSelections :: IsContact a => [a] -> [PhoneWithSelectionContact]
filterSelections xs = filter isSelection xs
where
isSelection :: IsContact a => a -> Bool
isSelection PhoneContact = False
isSelection PhoneWithSelectionContact = True
```

Офисное барахло то падает, то взлетает, по ощущениям тяжело даётся, но эскалации отбили.. По сайту прогресс остановился, т.к. ряд действий вовлек меня в череду задачек, цель которых — себя поучить лишний раз и подумать о своём поведении. Одни даются хорошо, другие — хуже.. Потихоньку покрываю интерфейсы разные..

Добавил haskell, т.к. столкнулся с тем, что в пакете HDBC-odbc по умолчанию модуль пытается считать DSN из C:\Windows\System32\odbcad32.exe, а не C:\Windows\SysWoW64\odbcad32.exe. Сил никаких нет, хочу заполучить данные из MS Access, попутно простреливая себе колени. Есть идеи, куда нажать?

Курс Functional Programming In Haskell (University Of Glasgow) на FutureLearn на поверку оказался вообще ни о чём. Черновик курса, набор недописанных плохо упорядоченных материалов. Лекторы неинтересные.

hPutStr :: Handle -> BL.ByteString -> IO ()
hPutStr hdl lbs = wantWritableHandle "Data.ByteString.Lazy.hPutStr" hdl $ \hdl__ ->
  BL.foldrChunks (go hdl__) (commit hdl__) lbs
 where
  go hdl__ (S.PS ps s l) rest = do
   unless (l == 0) $ withForeignPtr ps $ \p -> do
    _ <- bufWrite hdl__ (p `plusPtr` s) l True
    pure ()
   rest
  commit hdl__ =
   case haBufferMode hdl__ of
    BlockBuffering _   -> do return ()
    _line_or_no_buffering -> do flushWriteBuffer hdl__
                  return ()

В догонку к #2877381. Теперь я не только не понимаю зачем линзы (на самом деле призмы) обмазаны Profunctor, но ещё и не понимаю зачем нужен Profunctor, если есть Arrow. Стрелки в принципе делают всё то же самое.