ืืงืืฅ ืฉืขืืจ ืืฉืชืชืคืชื
ืืืฉืชืชืฃ ื-Google Summer of Code 2019, ืขืฉืืชื ืคืจืืืงื ืืชืื ืืกืคืจืืื
ืืคืืกื ืื ืืืืจ ืขื ืืืืฉืื ืฉืื ืฉื ืืืืืจืืชื ืืืืืงืช ืืจืฃ ืขืืืจ ืื-ืฆืืืืืช ื- Haskell. ืืืจืืช ืฉืืืืืืจืืชื ืืื ืืื ืืืกืืกืืื ืืืืชืจ, ืืืืฉื ืืืชื ืืฆืืจื ืืคื ืืกืื ืื ืคืื ืงืฆืืื ืื ืืงื ืื ืืกืคืจ ืืืืจืฆืืืช ืืืจืฉ ืื ืืจืื ืขืืืื. ืืชืืฆืื ืืื, ืืกืชืคืงืชื ืืืืฉืื ืขื ืฉื ืื ืืื ืืืช.
ืขื ืขืฆืื
ืฉืื ืืืกืืื ืืืคืจืื, ืื ื ืกืืืื ื ืฉื ื ืจืืืขืืช ืืกื ื ืคืืจืืืจื HSE. ืืืงืื ืืืชืจ ืืืืื ืืชืืชื
ืขื ืืืฉืื ืืืืืืจืืชื
ืคึฐึผืชึดืืึท
ืกืืืื ืืื ืืืฉืชืชืคืื ืืชืืื ืืช ืืืืื ืื ืืืื ืืืชืื ืืืื. ืื ืกืืคืงื ืื ืคืืืคืืจืื ืืืืื
ื ืืชื ืืืฆืื Pull Request ืขื ืืงืื ืืืืืืจ
ืืชื ืืืื ืืงืจืื ืขื ืชืืฆืืืช ืืขืืืื ืฉืื (ืืื ืืืืช)
ืคืืกื ืื ื ืืขื ืืืืืจ ืืงืืจื ืืช ืืืืฉืืื ืืืกืืกืืื ืืชืื ืืช ืคืื ืงืฆืืื ืื, ืื ืื ืื ืกื ืืืืืืจ ืืื ืืืื ืืื ืืื ื ืขืฉื ืฉืืืืฉ ืืืื ืืืื.
ืืืืงืช ืืจืคืื ืืื-ืฆืืืืืช
ืืืืืจืืชื ืืืืืงืช ืืจืฃ ืืื-ืืืงืืืช ื ืืชื ืืืจื ืืื ืืงืืจืก ืขื ืืืืืจืืชืืื ืืืื ืืืืืืจืืชืื ืืืจืคืื ืืคืฉืืืื ืืืืชืจ. ืืจืขืืื ืฉืื ืคืฉืื: ืชืืืื ืื ื ืืืืฉืื ืฉืืื ืงืืืงืืืื ืืืืง ืืฉืืืื ืื ืืืื ื, ืืืืฉืจ ื ืืฆื ืงืฆื ืกืืชืจ, ืื ื ืืืขื ืื ืฉืืืจืฃ ืืื ื ืื-ืืืงื.
ืงืฆืช ืืืชืจ ืคืืจืื: ืจืืฉืืช ืฉืื ื ืงืืืงืื ืืืฉืื ืืืืง ืืฉืืืื. ืืจืืจ ืฉืื ืืฉืื ืื ืฉื ืืงืืืงืื ืืื ืืืืืื ืืฉืื ืืืื ื ืืืื ืืช. ืืชืจ ืขื ืื, ืื ืืฉืื ืื ืฉื ืืฉืื ืื ืฉื ืงืืืงืื ืื ืืืืืื ืืฉืื ืืืื ื ืืฉืืืืืช, ืืื ืืืื. ืื ื ืืืฉืืืื ืืืงืฆืืช ืฉืืชืืคืื ืืงืืืงืืืื ืื ืขืื ืืฉ ืงืืืงืืืื ืืจืืื ืืืืืืจ ืฉื ืืงืืืงืื ืืืชื ืืชืืื ื ืฉืื ืืงืฆืื ื ืืื ืฉืื ืื. ืืืืจ ืืื ื ืืืืจ ืขื ืคืขืืื ืื ืขืืืจ ืื ืืจืืืืื ืืืืืืจืื.
ืื ืืฉ ืงืฆื ืืื ืงืืืงืืืื ืฉื ืืคืืื ืืืืชื ืืืืฆื, ืื ืงืฉื ืืืฆืื ืืืืืจ ืื ืืืื ืืืจืฃ, ืืืจ ืืืืืข (ืืื ืืจืืจ) ืืืชื ืืคืฉืจื ืืืจืฃ ืื-ืืืงื. ืืืจืช, ืืฉ ืื ื ืืืืฆื ื ืืื ื, ืื ืฉืืืืจ ืฉืืืจืฃ ืืื ืื-ืืืงื.
ืืืจื ืืื, ืืืืืจืืชื ืื ืืืืฉื ืืืืฆืขืืช
ืืคืืื, ืืืขื ื ืืชืื ืืช ืืืื. ืื ื ืืืฆืื ืืช ืงืืืงืืื ืืืจืฃ ืืืืฆืขืืช ืืืคืืฉ ืขืืืง ืจืืฉืื ืืืงืฆืื ืืื ืฉืืชืืคืื, ืืฉื ืื ืืช ืืกืคืจ ืืฉืืชืืฃ ืชืื ืืื ืชื ืืขื ืืืืจื ืืงืฆื. ืื ื ื ืกื ืืืงืฆืืช ืฉืืชืืฃ ืืงืืืงืื ืฉืืืจ ืืืงืฆื ืื ืฉืืชืืฃ, ื ืืื ืืืืจ ืืืืื ืฉืืืจืฃ ืืื ื ืื-ืืืงื. ืืจืืข ืฉืื ืืงืืืงืืืื ืืืงืฆืื ืฉืืชืืฃ ืืืืงื ื ืืช ืื ืืงืฆืืืช, ืืฉ ืื ื ืืืืฆื ืืืื.
ืืืืจ ืืืืฉืืืื
ืืืกืงื ืื ื ืื ืืืื ืฉืื ืืืืฉืืืื ืื ืึฐื ึทืงืึนืช. ืขื ืืืช, ืื ืื ืืื ืืืืช ืืืงืจื, ืื ืืืืชื ืื ื ืืจื ืืืืคืืก ืฉืื ืืืจ ืืืกื. ืืืื, ื ืงื ืืืืฉืืืื ืื ืื ืขืฆืื ืื ืฉืืื ืืื ื ืงื ืกืืืืช ืืืฉื ืืฉืื. ืื ืืืืฉืืืื ืืืชืจืืฉืื ืืชืืื ืืช ื ืืืฆืื ืืืืฉืื ืืืืื ืก "ืึธืึตื" ืืื ืืื IO.
ืืื ืืืืช ืื ืืจื ืืืืฆื ืืืฉืืืื ืืืชื ืืคืงืืื ืืืืกืงื. ืืกืืจ ืืืฆื ืื ืคืืขืืื ืืื ืืขืืจ ืืชืืื ืืคืืกื ืืื. ืชืืืืจ ืืื ืืืจืืจ ื ืืชื ืืงืจืื ืืื ืืืืช
ืืื ืื ื ืจืืฆื ืืฆืืื ืฉืืขืื ืืื ืืื ืืืช, ืืื IO, ืืืืฉืืืช ืืืืฆืขืืช ืงืกื ืืืืจ, ืืืขื ืื ืืืืจืืช ืืืืฉืืืช ืืชืืื ื ืืื ืืืืฉืืืื ืืื ืืืืจืื.
ืืฉ ืืจืื ืืคืงืืื ืืืื ืืื ืืฉ ืืช ืืืื ืืื ืฉืื. ืืืื ืชืืืืจืื ืืืื ืืืงื ืืืคื: ืื ืืืื ืืืช ืืืืฉืืืช ืืช ืืืชื ืืืฉืง. ื ืืืจ ืขื ืฉืืืฉ ืืืื ืืืืช ืืืืืช:
- ืื ea ืืื ืืืฉืื ืฉืืืืืจ ืขืจื ืืกืื a ืื ืืืจืง ืืจืื ืืกืื e. ืืืชื ืืืืช ืฉื ืืืื ืืื ืืื ืืืื ืืืื ืืืืคืื ืืืจืืืื ืืฉืคืืช ืฆืืืื: ื ืืชื ืืชืคืืก ืฉืืืืืช ืื ืืืขืืืจ ืืืชื ืืืื. ืืืืื ืืขืืงืจื ืืื ืฉืืืื ืืื ืืืืฉืืช ืืืืคื ืืืืื ื ืืืืืืื ืืกืคืจืืื ืืกืื ืืจืืืช ื- Haskell, ืืขืื ืฉืฉืคืืช ืฆืืืื ืืฉืชืืฉืืช ืืืจื ืืื ืืื ืื ืื ื ืืขืจืืช ืืืคืขืื.
- ืืฆื sa ืืื ืืืฉืื ืฉืืืืืจ ืขืจื ืืกืื a ืืืฉ ืื ืืืฉื ืืืฆื ื ืืชื ืืฉืื ืื ืืกืื s.
- ืืืื. ืืืื ืืื ืืืื ืืืืืช ืืืฉืื ืฉื ืืชื ืืืคืจืืข ืืื ืขืช ืขื ืืื ืืืืจืช ืืืื. ืขื ืืืช, ื ืืืจ ืขื ืืืืขืช ืืืืงื MonadPlus ืืกืื Maybe, ืืืืื ืืช ืืืฉืคืขื ืืืคืืื: ืืืืืจ ืืืืฉืื ืฉื ืืชื ืืืคืจืืข ืืื ืขืช ืขื ืืื ืืืืจืช ืขืจื ืกืคืฆืืคื.
ืืืฉืื ืืืืืืจืืชื
ืืฉ ืื ื ืฉื ื ืกืืื ื ืชืื ืื, ืืจืฃ a ื-Bigraph ab, ืืจืืฉืื ืฉืืื ืืืืฆื ืืจืคืื ืขื ืงืืืงืืืื ืืืกืืื ืื ืืขืจืืื ืืกืื a, ืืืฉื ื ืืืืฆื ืืจืคืื ืื-ืืืงืืื ืขื ืงืืืงืืืื ืืฆื ืฉืืื ืืืกืืื ืื ืืขืจืืื ืืกืื a ืืืืื -ืงืืืงืืื ืฆื ืืืกืืื ืื ืืขืจืืื ืืกืื b.
ืืื ืื ืืืคืืกืื ืืกืคืจืืืช ืืฆื. ืืืื ืืื ืืืฆืื ืืืจืคืื ืื-ืฆืืืืื ืืืชื ืืืืื ืื. ืืื ืชื ืืช ืืกืืืื ืืืื ืืฉืืื ืืืืืจืืช.
ื ืืืงืง ืื ืืคืื ืงืฆืืืช ืขืืืจ ืขื ืืืชืืืืช ืืืืืช:
-- ะกะฟะธัะพะบ ัะพัะตะดะตะน ะดะฐะฝะฝะพะน ะฒะตััะธะฝั.
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)
ืงื ืืจืืืช ืฉืื ืืืืื ืืืืคืืฉ ืืขืืืง-ืจืืฉืื ืืฆืื ื ืงืฆื ืกืืชืจ, ืืืืืืจ ืืืืืจ ื ืืฆื ืขื ืืื ืขืจืืืช ืืจืงืืจืกืื. ืืคืืื, ืืื ืืฉืืืจ ืืืชื, ืขืืื ื ืื ืชืง ืืื ืืืกื ืืช ืืจืงืืจืกืื ืืขื ืืืชืจืืฉืืช ืืจืืฉืื ื ืฉื ืืงืืืงืื ืืืืจืื.
ืื ื ืืืืฉืืื ืืืคืืฉ ืขืืืง ืจืืฉืื ืขื ืืื ืฉืืืจื ืขื ืืขืจื ืืกืืฆืืืืืื ืฉื ืืกืคืจื ืฉืืชืืฃ ืขืืืจ ืื ืงืืืงืื. ืืืกื ืืช ืืจืงืืจืกืื ืชืืฉืืจ ืืืืืืืืช ืืืืฆืขืืช ืืืฉืื ืืืืงืช ื-Functor ืฉื ืืืื ืืื ืฉืืืจื ื: ื ืฆืืจื ืจืง ืืืื ืืก ืืช ืื ืืงืืืงืืืื ืืื ืชืื ืืชืืฆืื ืืืืืืจืช ืืืคืื ืงืฆืื ืืจืงืืจืกืืืืช.
ืืจืขืืื ืืจืืฉืื ืฉืื ืืื ืืืฉืชืืฉ ืืืื ืืื "Ether", ืฉื ืจืื ืื ืืืืฉืืช ืืืืืง ืืช ืืืฉืคืขืืช ืฉืื ื ืฆืจืืืื. ืืืืฉืื ืืจืืฉืื ืฉืืชืืชื ืืื ืงืจืื ืืืื ืืืคืฉืจืืช ืืื. ืืืขืฉื, ืืื ืื ืืืืฉื ืืืฉืืืื ืฉืื ืื ืืฉืื ืืกืืื ืืืกืืคื ืฉื ืืืจ ืืกืชืคืงืชื ืืืื ืืืจ.
ืจืืฉืืช, ืื ืื ื ืฆืจืืืื ืืฉืืืจ ืขื ืืขืจื ืืกืืฆืืืืืื ืฉื ืืืื ืฉืืชืืฃ - ืื ืืฉืื ืืืื State. ืฉื ืืช, ืื ืื ื ืฆืจืืืื ืืืืืช ืืกืืืืื ืืขืฆืืจ ืืืฉืจ ืืชืืื ืงืื ืคืืืงื. ืื ืืืื ืืืืืช Monad ืขืืืจ ืื ืืื, ืื MonadPlus ืขืืืจ ืืืื. ืืืืื ืืขืืงืจื ืืื ืฉืืื ืืื ืืืื ืืืืืืจ ืขืจื ืื ืืืืฉืื ืื ืืืคืกืง, ืืืืื ืืืืืจ ืจืง ืืืืข ืขื ืื ืืืงืจื ืื. ืืืืืื ืฉืื ืื ื ืื ืฆืจืืืื ืขืจื ื ืคืจื ืืืฆืืื (ืืื ืืืจ ืืืืืกื ื-State), ืื ืื ื ืืืืจืื ืืืื. ืืืจืืข ืฉืื ืื ืื ื ืฆืจืืืื ืืฉืื ืืช ืืืฉืคืขืืช ืฉื ืฉืชื ืืื ืืืืช, ืื ืืืฆืืืช ืืืืฆื
ืืื ืืืจืชื ืืกืื ืื ืื ืืืจืื? ืฉืชื ืกืืืืช. ืจืืฉืืช, ืืืืฉืื ืืชืืจืจ ืืืืื ืืืื ืืฆืืืื. ืฉื ืืช, ืขืืื ื ืืชืืจื ืืช ืขืจื ืืืืืจื ืืืงืจื ืฉื ืงืื ืคืืืงื ืืืฉืจ ืืืืจืื ืืืจืงืืจืกืื ืืื ืืฉืืืจ ืืช ืืืืืื ืืื ืืืืืช, ืื ืฉืืจืื ืืืชืจ ืงื ืืขืฉืืช ืืืื ืืื ืืืื.
ืื ืื ื ืืงืืืื ืืช ืืืืฉืื ืืื.
{-# 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 ืืื ืืืืง ืฉื ืืืคืืฉ ืขืืืง ืจืืฉืื ืฉืื ืื ื ืืืงืจืื ืืงืืืงืื ืืคืขื ืืจืืฉืื ื. ืืื ืื ื ืืงืฆืื ืืกืคืจ ืืฉืืชืฃ ืืงืืืงืื ืืืคืขืืืื ืืช onEdge ืขื ืื ืืฉืื ืื. ืื ืื ืืืงืื ืฉืื ืื ื ืืฉืืืจืื ืืช ืืืกื ืืช ืืงืจืืื: ืื msum ืืืืืจ ืขืจื, ืื ื ืืืืคืื ืืฉื ืืช ืงืืืงืื v.
- onEdge ืืื ืืืืง ืฉืื ืื ื ืืืงืจืื ืืงืฆื. ืื ื ืงืจื ืคืขืืืื ืขืืืจ ืื ืงืฆื. ืืื ืื ื ืืืืงืื ืื ืืงืืืงืื ืืฆื ืืฉื ื ืืืงืจ, ืืืืงืจืื ืื ืื ืื. ืื ืืืงืจื ื, ืื ื ืืืืงืื ืื ืืงืฆื ืกืืชืจ. ืื ืื, ื ืืืืจ ืืช ืืขืจื - ืืืืง ืืขืืืื ืฉื ืขืจืืืช ืืจืงืืจืกืื, ืฉื ืื ืฉืืจ ืืงืืืงืืืื ืืืฆืื ืืืืจ ืืืืจื.
- processVertex ืืืืง ืขืืืจ ืื ืงืืืงืื ืื ืืืงืจ ืื ืืืคืขืื ืขืืื inVertex ืื ืื.
- dfs ืืจืืฅ ืืช processVertex ืขื ืื ืืงืืืงืืืื.
ืื ืืื.
ืืืกืืืจืื ืฉื ืืืืื INLINE
ืืืืื INLINE ืื ืืืืชื ืืืืฉืื ืืจืืฉืื ืฉื ืืืืืืจืืชื; ืืื ืืืคืืขื ืืืืืจ ืืืชืจ. ืืฉื ืืกืืชื ืืืฆืื ืืืฉืื ืืื ืืืชืจ, ืืืืืชื ืฉืืืจืกื ืืื-INLINE ืืืืชื ืืืืืช ืืืชืจ ืืืื ืืจืคืื. ืืืชืืฉื ืืื ืฉืืืืื ื ืกืื ืืืช ืืคืื ืงืฆืืืช ืฆืจืืืืช ืืขืืื ืืืชื ืืืืจ, ืื ืืืื ืืคืชืืข ืืืชื. ืืคืืื ืืืืจ ืืืชืจ, ืืืืื ื ืืืจืช ืขื ืืจืกื ืืืจืช ืฉื GHC ืื ืืื ืืืื ื ืืืจ.
ืืืืจ ืฉืืืืืชื ืฉืืืข ืืงืจืืืช ืคืื GHC Core, ืืฆืืืชื ืืชืงื ืืช ืืืขืื ืขื ืฉืืจื ืืืช ืฉื INLINE ืืคืืจืฉืช. ืืฉืื ืืกืืื ืืื GHC 8.4.4 ื-GHC 8.6.5 ืืืืคืืืืืืจ ืืคืกืืง ืืขืฉืืช ืืืช ืืขืฆืื.
ืื ืฆืืคืืชื ืืืืชืงื ืืืืืื ืืื ืืชืื ืืช Haskell. ืขื ืืืช, ืื ืืืื, ืืืขืื ืืืคืืืืืืฆืื ืืคืขืืื ืขืืฉืื ืืขืืืืช, ืืชืคืงืืื ื ืืชืช ืืื ืจืืืื. ืืืืืื, ืืื ืื ื ืืืืขืื ืฉืืคืื ืงืฆืื ืฆืจืืื ืืืืืช ืืืืืขืช ืืืืืื ืฉืืื ืืืืืขืช ืืืจืกืช ืืฆืืืื, ืืื ืกืืื ืืชืช ืจืื ืืืืืจ.
ืื ืงืจื ืืืจ ืื?
ืืื ืืืฉืืชื ืืช ืืืืืืจืืชื ืฉื ืืืคืงืจืืคื-ืงืืจืค ืขื ืืื ืืืช ืืืจืืช, ืืื ืืื ืกืืฃ ืืชืืื ืืช.
ืืืืืช ื-Google Summer of Code, ืจืืฉืชื ื ืืกืืื ืืขืฉื ืืชืื ืืช ืคืื ืงืฆืืื ืื, ืฉืื ืจืง ืขืืจ ืื ืืงืื ืืชืืืืช ืื'ืืื ืกืืจืื ืืงืืฅ ืฉืืืืจ ืืื (ืื ื ืื ืืืื ืขื ืืื ืืืงืื ืืื ืืืืจ ืืคืืื ืืงืจื ืืงืื ืืืงืื ืฉื ืืืืจ, ืืื ืื ืืื ืืืืืืืื ืฉืืื ืืชื ืืืื ืืงืืฅ ืืขืกืืง ืืชืื ืืช ืคืื ืงืฆืืื ืื), ืืื ืื ืืืืจ ืื ืืช ืืขืืื ืืืืคืื ืฉื ืืืฉืื ืืคืจืืืืื ืืื ืืคืืขื, ืฉืื ื ืืืืคื ืืฉืืขืืชื ืืื ืืกืืื ืฉืื ืืฉืคืืช ืืกืืจืชืืืช.
ืืงืืจ: www.habr.com