Darwin
разыскал в истории, но похоже он протух (
Darwin
если об этом речь
Зигохистоморфный
http://sdkman.io/index.html
adam
а какие задачи нормально с помощью Forall решаются? Есть туториал нормальный?
всё, где нужны профункторы, энды, коэнды, кан расширения
adam
data T f n = T (f n) (T f (Maybe n)) memoize :: Functor f => (forall a. (n -> a, [a]) -> f a) -> T f n memoize f = T .: (yoneda . fst) `on` (memoize . snd) $ psi (f . phi) yoneda :: (forall b . (a -> b) -> f b) -> f a yoneda = ($ id) psi :: (Either a b -> c) -> (a -> c, b -> c) psi f = (f . Left, f . Right) phi :: Either (n -> a) (Maybe n -> a, [a]) -> (n -> a, [a]) phi (Left f) = (f, []) phi (Right (f, as)) = (\n -> f (Just n), f Nothing : as)
adam
Ну или тот же фри функтор
Зигохистоморфный
фри функтор это вроде койонеда
Зигохистоморфный
data FreeFunctor f a = forall i. FMap (i -> a) (f i)
Mi Shа
Ад-хок полиморфизм разумеется есть, но для объявления полей рекордов этого не происходит. Чтобы происходило - выше предлагали {-# LANGUAGE DuplicateRecordFields #-}
Всем привет! Мне вчера посоветовали эту штуку, чтобы можно было создавать рекорды с одинаковыми полями. Но компилятор теперь не может понять, какой геттер использовать, даже если я явно указал тип. let node = find (\n -> id (n :: Node) == nodeId) $ nodes graphвыдает Ambiguous occurrence `id' It could refer to either `Prelude.id', imported from `Prelude' at bee.hs:1:1 (and originally defined in `GHC.Base') or the field `id', defined at bee.hs:7:25 or the field `id', defined at bee.hs:5:24
Aleksei (astynax)
Так тут ещё и совпадение с функцией id из Prelude
Mi Shа
Почему?
Vasiliy
оно того не стоит
Mi Shа
мм, а как тогда лучше назвать поля? data Node a b = Node { id :: a, body :: b, edges :: [Edge a b a] } deriving (Show) data Edge a b c = Edge {id :: a, body :: b, nodeId :: c } deriving (Show)
Aleksei (astynax)
Просто спрячь id из Prelude. Или поля иначе назови
Зигохистоморфный
ну или idNode
Зигохистоморфный
или nodeId
Vasiliy
nodeId, nodeEdges, edgeId, edgeNode
Aleksei (astynax)
id - встроенная функция с типом a -> a, который "подходит" в любом контексте. Поэтому в коде с id, даже с аннотированными типами всегда будет два варианта - id-функция и id-геттер
Aleksei (astynax)
import Prelude hiding (id) кароч
Mi Shа
Оо, спасибо большое!
Aleksei (astynax)
Собственно, компилятор об этом и сказал: Ambiguous occurrence `id' It could refer to either `Prelude.id', imported from `Prelude'
Alexander
лучше в рекордах делать префикис от имени, например Node ` nId/nodeId
Alexander
если хочется старые ghc поддерживать
Aleksei (astynax)
Можно класть в разные модули и пользовать квалифицированно :)
Aleksei (astynax)
import qualified BlaBla.Node as Node ... node { id = Node.id node + 1 } :)
Aleksei (astynax)
Кто-нибудь пробовал https://github.com/thumphries/hgrep?
Зигохистоморфный
есть же раст версия
Зигохистоморфный
очень быстро
Зигохистоморфный
https://github.com/BurntSushi/ripgrep
Aleksei (astynax)
Ты README читал?
Aleksei (astynax)
> Search Haskell source code from the command line.
Aleksei (astynax)
hgrep понимает, что если ты ищешь FooBar, то тебе нужно определение типа/конструктора
Зигохистоморфный
https://github.com/willtim/Expresso
Kirill
Какие есть годные альтернативы mtl? (надоело рисовать кучу инстансов для кастомных монадок)
Kirill
MonadError, MonadState,...
Kirill
Или я что-то не так делаю?
Zheka
Народ, кто-нибудь может поделиться книгой Haskell Book? Очень нужно, платить дорого :(
Aleksei (astynax)
Какие есть годные альтернативы mtl? (надоело рисовать кучу инстансов для кастомных монадок)
Всегда можно весь стек разруливать самому. Если стэк неглубокий, то можно и без MTL вполне жить
Kirill
Неудобно же
Kirill
Да и стейт, ридер, прочее не очень хочется самому костылить
Зигохистоморфный
а что плохого в (MonadX m, MonadY m) => m?
Kirill
а что плохого в (MonadX m, MonadY m) => m?
Это в инстансе или в методе?
Zheka
именно, поэтому и не хочу платить
Zheka
но если уж кто-то купил, то хотя бы не зря деньги потратил
Vasiliy
Kirill
что значит костылить? GeneralizedNewtypeDeriving же
Либо я чего-то не знаю, либо оно не поможет
Zheka
haskellbook.com
Anonymous
А
Anonymous
Да, куда кидать?
Zheka
Можно через ЛС кинуть файлом
Anonymous
Книгу пока не читал - много чего есть по haskell. В целом полезного есть, но не оч много.
Anonymous
Ок, сейчас
Kirill
Ну то есть есть пара своих монадок (MyMonadT, MyOtherMonadT) со своими MonadX классами и есть "юзерский" код который использует стек из этих двух + пару из mtl, раздражает именно необходимость написания кучи однотипных инстансов
Vasiliy
инстансы классов из mtl для MyMonadT и MyOtherMonadT выводятся с помощью GeneralizedNewtypeDeriving, инстансы их собственных классов - MonadMyMonad и MonadMyOtherMonad пишутся через DefaultSignatures и MonadTrans
Vasiliy
согласен, бойлерплейт и всё такое, но не так уж и много
Vasiliy
я пробовал ковыряться со всякими extensible и freer effects, но профита особого не увидел
Alexander
mtl о том, чтобы определять свой класс и реализовывать инстансы (можно упрощать с DefaultSignatures да)
Alexander
а с MonadTrans и трансформерами + mtl обычно получается франкенштейн
Vasiliy
а с MonadTrans и трансформерами + mtl обычно получается франкенштейн
у меня дефолтные реализации как раз через MonadTrans написаны, вроде норм
Vasiliy
код, правда, совсем простой
Anatolii
Alexander
оно разваливается если начинается несколько вещей работающих как Reader например
Vasiliy
class Monad m => Time m where now :: m UTCTime default now :: (Time n, MonadTrans t, m ~ t n) => m UTCTime now = lift now
Alexander
в итоге fundeps и большой стек - strikes back
Aleksei (astynax)
Можно тэгированные версии использовать, не? Тогда не развалится
Denis
ну это нужно теги или monad-classes
Vasiliy
Alexander
тогда треш и угар обход кривого изначального решения
Denis
ну и так далее, просто добавь воды^W^Wsprinkle some complexity
Alexander
а при достаточном количестве тегов ещё и нагиб компилятора