import Data.Char type Bukva = [Char] type Bukvi = [Bukva] type Stroka = [Char] type Cifra = Char type Cifri = [Cifra] hitriyPerevorot :: Stroka -> Stroka hitriyPerevorot stroka = zapolnitPropuski spisokBukvSPropuskamiVmestoCifr perevernutieCifri where zapolnitPropuski :: Bukvi -> Cifri -> Stroka zapolnitPropuski bukvi "" = concat bukvi zapolnitPropuski ("" : bukvi) (cifra : cifri) = cifra : zapolnitPropuski bukvi cifri zapolnitPropuski (bukva : bukvi) cifri = bukva ++ zapolnitPropuski bukvi cifri zapolnitPropuski [] cifri = error $ "Takogo ne mojet byt'! Lishnie cifri: " ++ cifri perevernutieCifri :: Cifri perevernutieCifri = reverse $ filter isDigit stroka spisokBukvSPropuskamiVmestoCifr :: Bukvi spisokBukvSPropuskamiVmestoCifr = map (\x -> if isDigit x then [] else [x]) stroka main = do let str = "1аб2в345г6де78" putStrLn str putStrLn $ hitriyPerevorot str