Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 29.10.2017
Сообщений: 15
1

Использование библиотеки Parsec, для форматирования списка телефонных номеров

13.01.2018, 17:28. Показов 812. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нижеприведенный код необходимо реализовать с использованием библиотеки Parsec


Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
data Result a = Ok a | Error String deriving (Show, Eq)
 
errorInvalidFormat s = Error $ "Invalid phone number format: " ++ s
 
normalizePhoneNumber :: String -> Result String
normalizePhoneNumber n = case n of
    (    '8':num) -> check10 num n
    ('+':'7':num) -> check10 num n
    _             -> check7 n
    _              -> errorInvalidFormat n
    where
        check10 num orig
            | length num == 10  =  Ok ("+7" ++ num)
            | otherwise         =  errorInvalidFormat n
        check7 num
            | length num == 7   =  Ok ("+7343" ++ num)
            | otherwise         =  errorInvalidFormat n
 
normalizePhoneNumbers :: [String] -> ([String], [String])
normalizePhoneNumbers = foldl merge ([], []) . map normalizePhoneNumber
    where
        merge (oks, errors) (Ok    num) = (num:oks, errors)
        merge (oks, errors) (Error err) = (oks, err:errors)
 
testPhoneNumbers =
    [ "89006508005"
    , "9119990868"
    , "+79997109088"
    , "89015572218"
    , "89250475333"
    , "77717793929"
    , "+74973273032"
    , "8921134454454454"
    , "8900650800"
    ,"+791111123"
    , "2492996"
    ]
 
main = let (numbers, errors) = normalizePhoneNumbers testPhoneNumbers in do
    mapM_ putStrLn numbers
    putStrLn ""
    putStrLn "ERRORS:"
    mapM_ putStrLn errors
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2018, 17:28
Ответы с готовыми решениями:

Форматирование списка телефонных номеров
Имеется некий список телефонных номеров, необходимо привести их к общему виду для региона: ...

Regex для украинских телефонных номеров
Привет форумчане.Помогите пожалуйста с настройкой диапазона regex под укр номера....

Составить регулярное выражение для поиска телефонных номеров
всем привет, можно ли как то одной регуляркой искать строки такого вида: +0 000 00-0-0, (000)...

Форматирование телефонных номеров
Всем привет! Помогите с написанием макроса для Excel. Необходимо отформатировать телефонные номера...

1
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
28.01.2018, 23:47 2
Так как автор темы сюда больше не заглянет (ибо сроки сдачи, скорее всего, давно прошли, ага), то позволю себе выложить сюда пример решения этой задачки... может тем, кто как и я когда-то искал примеры использования этой чудесной библиотеки будет полезно.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
{-# Language OverloadedStrings #-}
module Lib (someFunc) where
 
import Data.DoList (DoList, fromList, toList)
import Control.Monad
import Text.Parsec
import Data.Monoid
 
someFunc :: IO ()
someFunc = do
    forM_ testPhoneNumbers $ \number -> do
        print $ parse phoneNumber "Number: " number
 
phoneNumber :: Parsec String u String
phoneNumber = plusNum <|> num
 
-- номера начинающиеся на +7
plusNum :: Parsec String u String
plusNum = do
    string "+7" <|> string "8"
    code    <- readCode
    number  <- readNumber
    pure $ "+7" <> code <> number
 
-- остальные номера
num :: Parsec String u String
num = do
    number <- readNumber
    pure $ "+7(343)" <> number
 
 
readCode :: Parsec String u String
readCode = do
    optional $ char '('
    code    <- count 3 digit
    optional $ char ')'
    pure $ "("<> code <> ")"
 
 
readNumber :: Parsec String u String
readNumber = do
    digs1 <- count 3 digit
    optional $ char '-'
    digs2 <- count 2 digit
    optional $ char '-'
    digs3 <- count 2 digit
    pure $ digs1 <> "-" <> digs2 <> "-" <> digs3
 
 
testPhoneNumbers :: [String]
testPhoneNumbers = toList $ do
    "89006508005"
    "9119990868"
    "+7(999)710-90-88"
    "89015572218"
    "89250475333"
    "77717793929"
    "+74973273032"
    "8921134454454454"
    "8900650800"
    "+791111123"
    "2492996"
И весь код целиком в виде проекта... может потом туда ещё примеров накидаю, если лень не будет.
https://github.com/vojiranto/ParsecExemple
2
28.01.2018, 23:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2018, 23:47
Помогаю со студенческими работами здесь

Парсинг телефонных номеров
Работаю со специальной телефонной станцией которая выводит префиксы в формате 0079 , также есть...

Ввод телефонных номеров списком
Новичок просит помощи, т.к. примеров не нашёл (возможно плохо искал). Итак, вчера написал...

База данных телефонных номеров
Большая база данных телефонных номеров г. Саратова в Excel 4 столбца. в 4-м адрес. указан как...

Программа по обработке телефонных номеров
Моя идея заключается вот в чем: 1Хочу написать (САМ!!) программку, включаешь, открывается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru