{-# LANGUAGE OverloadedStrings #-} import Data.String import Data.Char import Data.List import Control.Monad type Dengi = Double type Kofe = Double type Stranici = Double data Kompanija = Kompanija {departamenti :: [Departament]} data Departament = Departament {imja :: String, rabi :: [Rabo4ij]} data Rabo4ij = Rabo4ij {dengi :: Dengi, kofe :: Kofe, stranici :: Stranici, rang :: Rang, ktoPoZhizni :: KtoPoZhizni} data KtoPoZhizni = Rab | Rukovoditelj data Rang = Pervij | Vtoroj | Tretij deriving Enum vektor = Kompanija [ Departament "Zakupki" $ join [ 9 `x` "me1", 3 `x` "me2", 2 `x` "me3", 2 `x` "ma1", ["me2R"]], Departament "Prodazhi" $ join [12 `x` "me1", 16 `x` "ma1", 3 `x` "an1", 2 `x` "an2", ["ma2R"]], Departament "Reklama" $ join [15 `x` "ma1", 10 `x` "ma2", 8 `x` "me1", 2 `x` "in1", ["ma3R"]], Departament "Logistika" $ join [13 `x` "me1", 5 `x` "me2", 5 `x` "in1", ["me1R"]]] dela = [ poschitat rabov, poschitat dengi, poschitat kofe, poschitat stranici, \departamenta -> poschitat dengi departamenta/poschitat stranici departamenta ] main = mapM_ print $ transpose $ vicheslit dela vektor vicheslit cho kompanija = [map f (departamenti kompanija) | f <- cho] poschitat cho gde = sum $ map cho $ rabi gde rabov = const 1 menedzher = Rabo4ij 500 20 200 marketolog = Rabo4ij 400 15 150 inzhener = Rabo4ij 200 5 50 analitik = Rabo4ij 800 50 5 x = replicate imena = map imja (departamenti vektor) instance IsString Rabo4ij where fromString (c1:c2:r:kto) = rabo4ij where rabo4ij = case ktoPoZhizni of Rukovoditelj -> rab {dengi = 1.5*dengi rab, kofe = 2*kofe rab, stranici = 0} _ -> rab ktoPoZhizni = case kto of ['R'] -> Rukovoditelj [] -> Rab govno -> error $ "ploxoj ktoPoZHizni: " ++ govno rang = toEnum (digitToInt r - 1) rab = defaultRab {dengi = dengi defaultRab * (1+0.25*fromIntegral (fromEnum rang))} where defaultRab = (case [c1,c2] of "me" -> menedzher "ma" -> marketolog "in" -> inzhener "an" -> analitik govno -> error $ "ploxaja abbreviatura raba: " ++ govno) rang ktoPoZhizni