αααΌααααα
αα»ααααα»αααΆαα
αΌααα½α
αααα»αααΆαααΆα’αααα
αΌααα½ααα
αααα»α Google Summer of Code 2019 αααα»αααΆαααααΎαααααααα½ααα
αααα»ααααααΆααα
αα αααα»αααΆααααααΆαααα αααα»αααΉααα·ααΆαα’αααΈααΆαα’αα»αααααααααααα»ααααααα½ααααααααΆααααααΆαααα·αα·αααααΎαααααΆα αααααααΆααααΆαααααααΆααΈαα αααα»α Haskell α αααααΈααΆαααα½ααααααααΆαααΊααΆααααααα½αααααΌαααααΆααααα»αααααα ααα»ααααααΆαα’αα»ααααααΆαααΆααααααααα’αΆααα αααα»ααα ααΆααααααα»αααΆαααΆαααααΎα±αααααα»αααααΎαααααααααΆα αααΎααα αα·αααΆαααΆαααΆαααΆαα αααΎαα ααΆαααααααααα»αααΆααααααααΆαααΎααΆαα’αα»ααααααΆαα½α monad transformers α
α’αααΈαααα½ααααα»α
ααααααααααααα»αααΊ Vasily Alferov αααα»αααΆαα·αααα·αααααΆαααΈ 4 αα
St. Petersburg HSE α αα»αααααα
αααα»αααααααααα»αααΆαααααα
α’αααΈααΆαα’αα»αααααααα½ααααααααΆα
αα»ααααααΆ
αα·ααααΆαα»αα·ααααααα
αΌααα½ααααα»ααααααα·ααΈαααααααΌαααΆαααΎαααΉαα
α·ααααααΆαααααΆαααααα»αααΆαααααααααα»αα αα½αααααΆααααααα±αααααα»αααΌααααα·ααΆαααααΆαααααα»α
ααΆαααααΎαααααααΎαααααΌααα
αααα»ααααα½αα’αΆα
ααααΆα
α’αααα’αΆα
α’αΆαα’αααΈααααααααααΆαααΆααααααααα»α (ααΆααΆααΆα’ααααααα)
αααααΆααααααααααααΆα’αααα’αΆαααΆαααααΆααααααααα·αααΆααΌαααααΆααααα»αααΆαααααααααααα·ααΈαααααΆααα»αααΆα αααααΈααΆαααα»αααΉαααααΆααΆαααααΉαα‘αΎααα·αααΌαααΆαααααΆααα’αααααααΆαααααΎαα αααααααααααααΆαααααα
αα·αα·αααααααΆα αααααααΆααααΆαααααααΆααΈ
αααα½ααααααααΆααααααΆαααα·αα·αααααΎαααααΆα αααααααΆααααΆαααααααΆααΈααΆααααααΆααααΌαααΆααααααα±αααα αααα»ααααααα·ααααΆααααΈααΈαααα½ααααααααΆααααααΆαααα½ααααααααΆαααααΆα ααααααΆαααααααα»ααα½αα αααα·αααααααΆααααΊαααααα ααααΌαααΎαααΆααα ααα»α ααααΌααα αααα»αα ααααααΆαααααα α¬ααααΆα α αΎααα αααααααΎααααααααααα»αααααΆ ααΎαα’αα’αΆαααΆααααΆα αααα·ααααααΆααααααΆααΈααα
ααααααΆααααα’α·αααααα·α α ααααΌαααΎαααΆααα ααα»α ααααΌααα½αα ααα½ααα αααα»αααΆαα αααααααααΆααααααα ααΆααααααα αααααααα·αααΆαααΆααα’ααααα ααα»α ααααΌααααααααΌαααααααα αααα»α lobe ααΆαααααΆαα ααΆαααααα ααα α’ααααα·αααΆαβααΆααα’ααβααααβα’αααβαα·αααΆαβααβα ααα»α βααααΌαβαααβααααΌαβαααβαα βαααααβααΆαααααα α αΎαβααΌα ααααβαα ααΎβα ααΎααααααααααααΆαα ααααααααα α ααα»α ααααΌα αααΆαααΆαα ααΆαα ααα»α ααααΌααα αααα»ααααΆαααΆαα»αααααΆααααα ααα»α ααααΌααααααΎαααΆαα αΆααααααΎαααΆαα½ααααααΎααα·αααΆααααααα±ααα’ααααα·αααΆαα αααααΆαααα ααΎαααααΎαααααααΆααααααααααααααααΆαααααΆαααΆαα»αααααΆααααααΆααααΆααα’ααα
ααααα·αααΎααΆαααααααΆαα ααα»α ααααΌααααααααΆααα αΌααα αααα»αααΆαααΆαααΌα ααααΆ ααΆαα·ααα·ααΆααααα»αααΆααααααααααααααααααα»αααααΆα αα αααααααΌαααΆαααααααΆαααααΆαααΌααααΌααΆα (α αΎαα αααΆααααΆαα) αα·αα’αΆα αα αα½α αα αααα»αααααΆα ααααααααΆααΈαααααα ααΎαα·αααΌα ααααααααΎαααΆαααΆαααΆαααααΉαααααΌααααααΆααααααΆααααΆα ααααΊααααααΆααΈα
ααΆααααααΆ αααα½ααααααααΆααααααααΌαααΆαα’αα»αααααααααααΎ
ααΌα ααααααΎαααΆαααααααααααααΆαααααΆααααααα ααΎαααααααΆααα ααα»α ααααΌαααααααΆα αααααααααΎααΆααααααααααααα ααααΌα α αΎααααααααΆαα αααααααααααα½ααα αααααααΆααααααΌαα ααα½αααααΆαα ααααααααα αααααΎαααααΆααααΈααΆααααα ααααα·αααΎααΎαααααΆααΆααααααααΆαα ααααααααα α ααα»α ααααΌααααααΆαα αααααααααΆαααααααα½α α αΎα ααΎαα’αΆα αα·ααΆαααααα»ααααα·ααΆαααΆααααΆα αααα·ααααααΆααααααΆααΈααα αα ααααααα ααα»α ααααΌαααΆααα’ααααααΌαααΆααααααα αααα α αΎαααΎαααΆαααΎααααααΆααα’αα ααΎαααΆαααΆαααΆαααααα’α
ααΆαααα·αα»αααααααΆαααααΆ
αα αααα»α Haskell ααΎααααααααΆααΆαααααΆααΆααα’ααααΊ ααα’αΆαα ααααααΆαααΆααααα ααααα·αααΎαααααΆααααΈαα·α ααΎαααΉαααααΆααα·ααΈααααα»αααα’αααΈααΎα’αααααααααααα ααΆααα’αα, ααα’αΆα ααΆαααααΆααΊαααα·αααΆααααααα·αααΆααα½αα ααα’αΆα α ααα»ααααΎααααΈααααΆα’αααΈαα½αα ααΆαααααΆααΆααα’αααααααΎαα‘αΎααα αααα»ααααααα·ααΈααααΌαααΆαααααααααααΌα ααααα "αα·αααα’αΆα" Monad IO α
Monads ααΊααΆαα·ααΈαα½αααΎααααΈααααΆαα±ααααΆαααααΆααΆαα½α αααααααΆαα αα
Haskell α ααΆαααααααααΈααααααααα½αααααααΎααΆαααΊα α½αααΈαα·ααΆαααΆααααααααΆααααα ααΆααα·αααααΆααα’ αα·αα
αααΆααααΆααα’αΆα
α’αΆαααΆααΆααΆα’αααααααααΆαα
αα ααΈααααααα»αα ααα ααα’α»ααααα αΆαααΆααααααααα monads αα½αα ααα½αααΌα ααΆ IO ααααΌαααΆαα’αα»ααααααΆαααα compiler magic ααααΎαααααΆααα’ααααααααααααααΌαααΆαα’αα»αααααα αααα»ααααααα·ααΈ α αΎαααΆαααααΆααΆααα’αααα αααα»αααΆααΊαα»αααα
ααΆααααααααΆααααΆα αααΎαα αΎαααΈαα½ααααΆα monad ααααΆαααααα½αα αααααΊααΆααααΉααααΈααααΉαααΆα αα·ααααααααα’αΆαα monads ααΆααα’ααα’αα»ααααα ααα»α αααααΆααααΌα ααααΆα ααΎαβααΉαβαα·ααΆαβα’αααΈβααααβα’αααβααΈβα’αααβααΌα βααΆαβαααααα
- ααΆαα ea ααΊααΆααΆαααααΆααααααα‘ααααααααααααααα a α¬αααααααΈααΎαααααααααααα e α α’αΆαααααα·αα·ααΆαααα monad αααααΊααααααααααΆαα ααΉαααΆααααααααΆαααααΈααΎαααααα αααα»αααΆααΆα αΆαααΆα α: ααα α»αα’αΆα ααααΌαααΆαα αΆααααΆαα¬ααααααΆααα ααΆααα»αααααΆααααΆααααΊααΆ monad ααααΌαααΆαα’αα»αααααααΆααααααααα αααα»ααααααΆααααααααααΆααα Haskell αααααααααααΆααΆα αΆαααΆα αααΆααααααΆααααΎααααααΆαααααααααααααα·ααααα·ααΆαα
- αααα sa ααΊααΆααΆαααααΆααααααα‘ααααααααααααααα a αα·αααΆααα·αααα·α αΌαααααΎααααΆαααΆααααα’αΆα ααααΆααααααΌαααΆααααααααα s α
- αααα ααααΆ α. The May monad αααα αΆαααΈααΆαααααΆαααα’αΆα ααααΌαααΆαααααΆααα αααααΆαα½αααααααα‘αα Nothing α αααααΆαααΆαααΆαααααααΎαααΉααα·ααΆαα’αααΈααΆαα’αα»ααααααααΆαα MonadPlus αααααΆαααααααα Maybe ααααααα αΆαααΈα₯αααα·αααααα»αααααΆα ααΆααΊααΆααΆαααααΆαααα’αΆα ααααΌαααΆαααααΆααα αααααΆαα½αααααααα‘αααααααααΆααααΆαααα½αα
ααΆαα’αα»αααααααα½ααααααααΆα
ααΎαααΆααααααααα·ααααααααΈαααΊ Graph a αα·α Bigraph ab αααααΈαα½αααααΆαα±ααααααΆα αααααααΆααααααΆααααααααααααΆαααααΆαααααααααααααα a αα·αααΈααΈαααααΆαα±ααααααΆα ααααααααΆααΈααΆαα½αα ααα»α ααααΌαααΆαααααααααααΆαααααΆαααααααααααααα a αα·αααΆαααααΆαα -side vertices αααβααΆαβααααΆαβαααααβααβαααααα b α
ααΆααααααα·ααααααΆααααααααΈαααααΆααα Alga ααα Alga αα·αααΆαααααΆααααααΆααααααΆα ααααααααΆααΈααααα·αααΆαααΉαααΆαααα αααα»αβααΆαβαααααΎαβααααααβαααβαααααΆααβααΆαβα αααΆααβααΆααα
ααΎαααααΉαααααΌαααΆααα»αααΆααααα½ααααααΆαα αααααααΆααΌα ααΆααααααα
-- Π‘ΠΏΠΈΡΠΎΠΊ ΡΠΎΡΠ΅Π΄Π΅ΠΉ Π΄Π°Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ.
neighbours :: Ord a => a -> Graph a -> [a]
-- ΠΠΎΡΡΡΠΎΠΈΡΡ Π΄Π²ΡΠ΄ΠΎΠ»ΡΠ½ΡΠΉ Π³ΡΠ°Ρ ΠΏΠΎ Π³ΡΠ°ΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ
-- Π²ΡΠ΄Π°ΡΡΠ΅ΠΉ Π΅Ρ Π΄ΠΎΠ»Ρ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠΊΡ Π² Π½ΠΎΠ²ΠΎΠΉ Π΄ΠΎΠ»Π΅, ΠΈΠ³Π½ΠΎΡΠΈΡΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ½ΡΠ΅ ΡΡΠ±ΡΠ°.
toBipartiteWith :: (Ord a, Ord b, Ord c) => (a -> Either b c)
-> Graph a
-> Bigraph b c
-- Π‘ΠΏΠΈΡΠΎΠΊ Π²Π΅ΡΡΠΈΠ½ Π² Π³ΡΠ°ΡΠ΅
vertexList :: Ord a => Graph a -> [a]
Π‘ΠΈΠ³Π½Π°ΡΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°ΡΡ, Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
type OddCycle a = [a]
detectParts :: Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
ααΆααΆααΆαααΆααααα½ααααα»αααΆαααΎαααΎαααΆ ααααα·αααΎαααα»αα’αα‘α»αααααααααααααααα ααααΌα ααΎαααΆαααααΎααααααααααα»αααααΆααα ααααααααααα·ααα ααΎααααΌααααααααΆαα α α‘αΎααα·αα ααΌα αααα ααΎααααΈααααΆαααΆα‘αΎααα·α ααΎαααααΌαααΆααααααΆα αα’αααΈαααΆααα’ααα ααααΈααΆααααααΌαα‘αΎααα·α αα αΌααααααΆαααΎαα‘αΎαααααΌαααα ααα»α α α»ααααααα
ααΎαα’αα»ααααααΆααααααααααααα ααααΌαααααααααΆα’αΆααααΆααααααααααααα ααααααααααααΆααα ααα»α ααΈαα½ααα ααα recursion ααΉαααααΌαααΆααααααΆαα»ααααααααααααααααα·ααΆααααααΆαα’αα»ααααααααααΆαα Functor αα monad αααααΎαααΆαααααΎαααΎα: ααΎαααΉαααααΆααααααααΌαααΆαααΆαααααααααΆααα’ααααΈααααΌαα αΌααα αααα»αααααααααααααα‘ααααΈαα»αααΆα recursive α
αααα·αααααΌααααααααα»αααΊααααΎ Either monad αααα αΆααααΌα ααΆα’αα»αααααααΆααα·αααααΆααααΌααααααααΆαααααααΎαααααΌαααΆαα ααΆαα’αα»ααααααααΌαααααααα»αααΆααααααααΊαα·ααααα·αααααΉααααααΎααααα ααΆααα·ααα αααα»αααΆαααΆαα’αα»ααααααααΆααααααααααΆαα α ααα»α αα½α α αΎααα ααΈαααα»αααΆααααααααΆαααΎαα½ααααα
ααΆααααΌα ααΎαααααΌααααααΆα’αΆαααα ααΆαααααΆααααααα’ααααααααΆαα
ααααααα - αααααΊααΆα’αααΈαα½αα’αααΈααααα ααΈααΈα ααΎαααααΌαααα’αΆα
αααααααα
ααααααααΆαααααααααααΌαααΆαααααΎαα αααα’αΆα
ααΆ Monad for Either α¬ MonadPlus for Maybeα ααΆααα»αααααΆα
αααααΊααΆ ααΆααα’αΆα
αααα‘ααααααααα½α ααααα·αααΎααΆαααααΆαα·αααΆααααααΌαααΆααααααα α αΎααααα ααααΆαααα‘ααααααααααΆαα’αααΈααΏαααααααα»αααααΈαααααα»αααααα αααβααΆαβααΎαβαα·αβααααΌαβααΆαβαααααβααΆα
αβαααβα‘ααβαααααΆααβααΆαβαααααα (ααΆβααααΌαβααΆαβαααααΆβαα»αβαα½α
βα αΎαβαααα»αβαααα) ααΎαβααααΎαβααΎαβαααα ααα α αΎαβαα
βαααβαααβααΎαβααααΌαβααΆαβαα½αβαααα
αΌαβα₯αααα·ααβαα monads ααΈαβααΆβα
ααβααβ
α ααα»α’αααΈααΆαααΆαααα»αααααΎαααΎααααααααααα»αααααΆααααααα? α ααα»ααααΈαα ααΈαα½α ααΆαα’αα»ααααααααααΆααααααααΉαααΆαα αΆαααΆα αα ααΈααΈα ααΎαααααΌααααα αααααααααα‘αααααα·ααααα»αααααΈααΆααααααααα ααααααααααααα·αααΈααΆαα α α‘αΎααα·αααΎααααΈααααΆαααααα·ααα»αααα αααααΆααααααΆααααα½αααααΎαα αααα»α Maybe monadα
ααΌα ααααααΎαααα½αααΆαααΆαα’αα»αααααααα
{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE ScopedTypeVariables #-}
data Part = LeftPart | RightPart
otherPart :: Part -> Part
otherPart LeftPart = RightPart
otherPart RightPart = LeftPart
type PartMap a = Map.Map a Part
type OddCycle a = [a]
toEither :: Ord a => PartMap a -> a -> Either a a
toEither m v = case fromJust (v `Map.lookup` m) of
LeftPart -> Left v
RightPart -> Right v
type PartMonad a = MaybeT (State (PartMap a)) [a]
detectParts :: forall a. Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
detectParts g = case runState (runMaybeT dfs) Map.empty of
(Just c, _) -> Left $ oddCycle c
(Nothing, m) -> Right $ toBipartiteWith (toEither m) g
where
inVertex :: Part -> a -> PartMonad a
inVertex p v = ((:) v) <$> do modify $ Map.insert v p
let q = otherPart p
msum [ onEdge q u | u <- neigbours v g ]
{-# INLINE onEdge #-}
onEdge :: Part -> a -> PartMonad a
onEdge p v = do m <- get
case v `Map.lookup` m of
Nothing -> inVertex p v
Just q -> do guard (q /= p)
return [v]
processVertex :: a -> PartMonad a
processVertex v = do m <- get
guard (v `Map.notMember` m)
inVertex LeftPart v
dfs :: PartMonad a
dfs = msum [ processVertex v | v <- vertexList g ]
oddCycle :: [a] -> [a]
oddCycle c = tail (dropWhile ((/=) last c) c)
ααααααααααααα»αααΊααΆααααΌααααααα½ααααααααΆαα αααα»αααΉαααααΆααΆαααααααααΈα’αααΈααααααα»αααΎαα‘αΎααα αααα»αααΆα
- inVertex ααΊααΆααααααα½αααααΆαααααααααααα ααααΌα αααααΎαα αΌααα ααΆαα vertex ααΆααΎαααααΌαα αα ααΈαααααΎαααααααααα ααααααααα vertex α αΎαααααΎαααΆα onEdge αα ααΎα’ααααα·αααΆαααΆααα’ααα αααααααΆαααααααααααΎαααααΆααααααΆαα α αααααα ααααα·αααΎ msum αααα‘ααααααααα½α ααΎααα»α vertex v αα ααΈαααα
- onEdge ααΊααΆααααααααααΎαααααααΆαααα ααΆααααΌαααΆαααα α ααΆααΈααααααααΆαααααααΈαα½ααα αα ααΈαααααΎααα·αα·αααααΎαααΆααΎ vertex αα ααααΆααααααααΌαααΆααα ααααααΆα αΎαα¬α’αα α αΎααα ααΎαααΆααααα·αααΎαα·αααΆαα ααααα·αααΎβααΆαβα αΌαβααααααΆ ααΎαβαα·αα·αααβααΎαβααΆβααΎβαααβααΆαβααααααβα¬βα’ααα ααααα·αααΎααΆααΆ ααΎααααα‘ααααααααα·α - ααααΌααααααααΆαα α α‘αΎααα·α αααα ααα»α ααααΌαααααααααααΆααα’ααααΉαααααΌαααΆαααΆαααα ααααααα‘αααααα·αα
- processVertex αα·αα·αααααα ααα»α ααααΌαααΈαα½ααααΆααΎααΆααααΌαααΆαα αΌαααΎα α αΎαααααΎαααΆααα αααα»αVertex ααΎααΆα¬α’ααα
- dfs ααααΎαααΆα processVertex αα ααΎααααΌαααΆααα’ααα
α’ααα αΎαα
αααααααα·ααααΆααα INLINE
ααΆααα INLINE αα·αβαααβαα βαααα»αβααΆαβα’αα»ααααβααααΌαβααβαααα½αβαααααααΆαβαααβαα ααΆβααΆαβαααα αΆαβαα βαααβαααααα αα αααααααααα»αααααΆααΆααααααααααΆαα’αα»ααααααααααααΎαααΆαααα αααα»αααΆαααααΎαααΆααααααααα·ααααααΆ INLINE ααΆαααΆαααΊααααΆααα½αα±ααααααααααΆαααα ααΎααααΆα αααα½αα ααα½αα ααααα·α αΆαααΆααΆαα»αααΆα semantically αα½αααααααΎαααΆαααΌα ααααΆ αααααααΎα±αααααα»αααααΆααααα’αΎααααΆαααααΆααα ααΌααααΈααααα»αααα αααααααααα αα ααΎαααΆαααΈααα½ααααααααααααααΆααααααα»αααααΆαα GHC αα·αααΆαααΆααα»αααααΆαα½αα±ααααααααααΆαααααααα
αααααΆααααΈα αααΆαααααα½ααααααΆα αα’αΆααααααα GHC Core αααα»αα’αΆα αααααααΆααααα αΆααΆαα½αααΉααααααΆααααΆααααΆαααα½α INLINE α αα α ααα»α αα½αα ααα½ααααΆα GHC 8.4.4 αα·α GHC 8.6.5 αααααα·ααΈαααααΎαααααα·αααααΆαααΆααααααααΎααΆααααααα½αα―αα
αααα»ααα·αααααΉαααΆααΉααα½ααααααααΆααααααααααααααα αααα»ααααααα·ααΈ Haskell αααααα ααααααΆαααΆααααα ααΌααααΈααααααααααααα α’ααααααααΎαααααα·αααααΆααααααααααΆαααα α»α α αΎαααΆααΆααΆαααΆαααααααΎααααα»αααΆααααααααΆαααααΆαααααα½αααα ααΆα§ααΆα ααα αα ααΈαααααΎαααΉαααΆαα»αααΆααα½αααααααΌαααΆαααΆαααααα»ααα½α αααααααΆααααΌαααΆαααΆαααααα αΌααααα»αααααα αΆαααΆα α α αΎααααααΆα ααα»ααααΎααααΈαααααααΆαααααΆααααα’αααα αααααα
ααΎααΆαα’αααΈααΎαα‘αΎααααααΆαα?
αααααΆαααααααα»αααΆαα’αα»αααααααα½ααααααααΆα Hopcroft-Karp ααΆαα½α monads αααααααα α αΎααααααΆα α»ααααα αααααααααα·ααΈα
ααΌαα’ααα»αααα Google Summer of Code αααα»αααα½αααΆααααα·αααααααΆααααααααααα»αααΆαααααααααααα·ααΈαα»αααΆα ααααα·αααααΉααααα½ααααα»αα±ααααα½αααΆααααααα·ααααΆαα
Jane Street αα
αααΌααααα
αααααΆαααα (αααα»ααα·αααααΆααααΆαααααααααααααΈααα»ααααΆαα ααΌααααΈααα’αααααααααΆαααααΆαα
ααααααΉααααα Habr ααα»ααααααΆααΆαααααααα½α αααα»αα
αααααααααααα½αα
ααα½ααααα’αααα’αΆα
α
αΌααα½ααααααα·ααΈαααααΆααα»αααΆααααα»ααααΌααααα
) ααα»ααααααααΆαααααΆααααα»ααα
ααΆαααα·ααααα’ααα
αΆαααααααΆαα’αα»ααααααααΌααααααα»αααΆαα’αα»αααα ααααα»αααΈαααα·ααααααααααααα»αααΆααΆααΆαααααααΈα
ααααα: www.habr.com