Darwin
разыскал в истории, но похоже он протух (
Darwin
если об этом речь
Зигохистоморфный
http://sdkman.io/index.html
adam
Зигохистоморфный
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)
Leonid 🦇
Aleksei (astynax)
Так тут ещё и совпадение с функцией id из Prelude
Vasiliy
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? Очень нужно, платить дорого :(
Kirill
Неудобно же
Kirill
Да и стейт, ридер, прочее не очень хочется самому костылить
Зигохистоморфный
а что плохого в (MonadX m, MonadY m) => m?
Зигохистоморфный
Kirill
Zheka
именно, поэтому и не хочу платить
Zheka
но если уж кто-то купил, то хотя бы не зря деньги потратил
Vasiliy
Denis
Kirill
Denis
Anonymous
Zheka
haskellbook.com
Anonymous
А
Anonymous
Да, куда кидать?
Zheka
Можно через ЛС кинуть файлом
Anonymous
Книгу пока не читал - много чего есть по haskell. В целом полезного есть, но не оч много.
Anonymous
Ок, сейчас
Kirill
Ну то есть есть пара своих монадок (MyMonadT, MyOtherMonadT) со своими MonadX классами и есть "юзерский" код который использует стек из этих двух + пару из mtl, раздражает именно необходимость написания кучи однотипных инстансов
Vasiliy
Vasiliy
инстансы классов из mtl для MyMonadT и MyOtherMonadT выводятся с помощью GeneralizedNewtypeDeriving, инстансы их собственных классов - MonadMyMonad и MonadMyOtherMonad пишутся через DefaultSignatures и MonadTrans
Vasiliy
согласен, бойлерплейт и всё такое, но не так уж и много
Vasiliy
я пробовал ковыряться со всякими extensible и freer effects, но профита особого не увидел
Alexander
mtl о том, чтобы определять свой класс и реализовывать инстансы (можно упрощать с DefaultSignatures да)
Alexander
а с MonadTrans и трансформерами + mtl обычно получается франкенштейн
Kirill
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
а при достаточном количестве тегов ещё и нагиб компилятора