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

функции

24.04.2020, 12:43. Показов 728. Ответов 3

Студворк — интернет-сервис помощи студентам
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
import Data.Char
 
data KeyCode = Sym Char | CapsLock | Shift Char deriving (Eq,Show) --множественный конструктор с использованием пользовательсих типов 
 
typCode :: KeyCode -> Int -- по коду возвращает его тип
typCode (Sym _)  = 0      -- обычная клавиша - тип=0
typCode CapsLock = -1    -- CapsLock - тип = -1
typCode (Shift _) = 1         -- Shift - тип = 1
 
getSym :: KeyCode -> Char
getSym (Sym   a) = a
getSym (Shift a) = a
 
 
getALNum :: [KeyCode] -> [KeyCode]
getALNum xs = [(Shift c) | (Shift c) <- xs]
 -- возвращает последовательность шифтов если встречается Shift, то он добавляется как элемент списка-результата.
--В квадратных скобках (в конструкторе списка) как бы описывается множество таких шифтов, которые принадлежат списку-аргументу.
 
getRaw :: [KeyCode] -> [KeyCode]
getRaw [] = []
getRaw (x:xs) | (typCode x) == 0  = x : (getRaw xs)
              | (typCode x) == -1 = getRaw xs
              | otherwise = (Sym (getSym x)) : getRaw xs
 
isCapsLocked  :: [KeyCode] -> Bool -> Bool
isCapsLocked [] cl = cl
isCapsLocked (x:xs) cl | (typCode x) == -1  = isCapsLocked xs (not cl)
                       | otherwise = isCapsLocked xs cl
 
 
getString :: [KeyCode] -> Bool -> String
getString [] _ = ""
getString (x:xs) cl | ((typCode x) == -1) = getString xs (not cl)
                    | ((typCode x) == 0) =  if cl then (toUpper (getSym x)) : (getString xs cl) else  (getSym x) : (getString xs cl) 
                    | otherwise = if (not cl) then (toUpper (getSym x)) : (getString xs cl) else  (getSym x) : (getString xs cl)
Помогите подобрать проверку к каждой функции, на getString придумал проверку
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.04.2020, 12:43
Ответы с готовыми решениями:

Рекурсивные функции, функции высшего порядка, преобразование императивных программ в функциональные
Простые рекурсивные функции для обработки списков: А) (ATOM-LIST x) проверяет, является ли х одноуровневым списком. Б) (WS2 a b...

Пропадают локальные переменные функции после первого запуска функции
Я написал код для расчёта электрического кольца. Я постепенно упрощаю схему параллельными и последовательными операциями. Вот мой код: (...

Определение экстремумов функции методом золотого сечения (переписать программу через функции)
program lab12 real,dimension(5):: p(5)=(/0,1,0,0,0/) integer::ii(3)=(/1,2,3/) real pi, q,x1,x2,eps,l pi=3.14159 n=40. ...

3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 14
24.04.2020, 13:15
Вот тест главной функции:

Haskell
1
2
3
4
5
6
*Main> getString [Shift 'a',Sym 'b',Sym 'r',Sym 'a',Sym 'd',Sym 'a',Sym 'b', Sym 'r',Sym 'a'] True
"aBRADABRA"
it :: String
*Main> getString [Shift 'a',Sym 'b',Sym 'r',Sym 'a',Sym 'd',Sym 'a',Sym 'b', Sym 'r',Sym 'a'] False
"Abradabra"
it :: String
2
275 / 50 / 2
Регистрация: 10.10.2017
Сообщений: 54
24.04.2020, 14:12
Добавим функции
Haskell
1
2
3
4
5
6
7
8
charToCode :: Char -> KeyCode
charToCode x = Sym x
 
charToShiftCode :: Char -> KeyCode
charToShiftCode x = Shift x
 
check :: (Eq a, Foldable t) => (a -> a) -> t a -> Bool
check f xs =  foldr ( \ x y -> (f x == x) && y ) True xs
Проверяем

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
check (getSym . charToCode) ['a'..'z']
True
check (getSym . charToCode) ['A'..'Z']
True
check (getSym . charToShiftCode) ['A'..'Z']
True
check (getSym . charToShiftCode) ['a'..'z']
True
check (charToCode . getSym) $ fmap Sym ['a'..'z']
True
check (charToCode . getSym) $ fmap Sym ['A'..'Z']
True
check (charToCode . getSym) $ fmap Shift ['A'..'Z']
False
check (charToCode . getSym) $ fmap Shift ['a'..'z']
False
check (charToShiftCode . getSym) $ fmap Shift ['A'..'Z']
True
check (charToShiftCode . getSym) $ fmap Sym ['A'..'Z']
False
2
Модератор
 Аватар для Curry
5158 / 3485 / 536
Регистрация: 01.06.2013
Сообщений: 7,561
Записей в блоге: 9
24.04.2020, 16:00
1. Вместо перечисления конструкторов данных целыми числами, нужно сделать своё перечисление. Это и наглядно, и не возникнут ошибки из за попытки смешивания с другими целыми.
2. В ф-ии getSym нужно перечислить все возможные варианты.
3. В ф-ии getString очень много повторяющегося кода
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
import Data.Char
 
data KeyCode = Sym Char | CapsLock | Shift Char deriving (Eq,Show) 
 
-- Тип для перечисления конструкторов данных типа KeyCode 
data EnumKeyCode = EnumSym | EnumCapsLock | EnumShift deriving (Eq,Show)
 
typCode :: KeyCode -> EnumKeyCode -- по коду возвращает его тип
typCode (Sym _)  = EnumSym      -- обычная клавиша 
typCode CapsLock = EnumCapsLock    -- CapsLock 
typCode (Shift _) = EnumShift         -- Shift 
 
getSym :: KeyCode -> Char
getSym (Sym   a) = a
getSym (Shift a) = a
getSym _ = error "getSym : the argument is CapsLock"  
 
getALNum :: [KeyCode] -> [KeyCode]
getALNum  = filter ((== EnumShift) . typCode)
 
getRaw :: [KeyCode] -> [KeyCode]
getRaw [] = []
getRaw (x:xs) | (typCode x) == EnumSym  = x : (getRaw xs)
              | (typCode x) == EnumCapsLock = getRaw xs
              | otherwise = (Sym (getSym x)) : getRaw xs
 
isCapsLocked  :: [KeyCode] -> Bool -> Bool
isCapsLocked [] cl = cl
isCapsLocked (x:xs) cl | (typCode x) == EnumCapsLock  = isCapsLocked xs (not cl)
                       | otherwise = isCapsLocked xs cl
 
 
getString :: [KeyCode] -> Bool -> String
getString [] _ = ""
getString (x:xs) cl = case typCode x of
                        EnumCapsLock -> getString xs (not cl)
                        EnumSym -> go id
                        _       -> go not
    where go f = ((if f cl then toUpper else id) (getSym x)) : (getString xs cl)
                    
main :: IO ()
main = do
  let testdata = [Shift 'a',Sym 'b',Sym 'r',Sym 'a',CapsLock, Sym 'k',Sym 'a',Sym 'd',Sym 'a',Sym 'b', Sym 'r',Sym 'a']
  putStrLn "=== map typCode testdata ==="
  print $ map typCode testdata
  putStrLn "=== map getSym $ take 4 testdata ==="
  print $ map getSym $ take 4 testdata
  putStrLn "=== getALNum testdata ==="
  print $ getALNum testdata
  putStrLn "=== getRaw testdata ==="
  print $ getRaw testdata
  mapM_ (\b -> do
        putStrLn $ "=== isCapsLocked testdata " ++ show b ++ " ==="
        print $ isCapsLocked testdata b
        putStrLn $ "=== getString testdata " ++ show b ++ " ==="
        print $ getString testdata b
        ) [False,True]
В приницпе, надо было бы на каждый тест написать ответ, а потом с ним сравнивать и сообщать passed или failure, но времени нет.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.04.2020, 16:00
Помогаю со студенческими работами здесь

вычислить значение функции используя разложение в ряд - 3 функции
Если были похожие темы, то указывайте ссылки, пожалуйста. 1. e=1+1/1!+1/2!+...+1/к!+... - сделано проверить. domains ...

Функции. Как после одного возвратного значения функции отталкиваться от возврата другой функции
Написал код, в котором 2 функции одна возвращает стринговое значение, вторая должна бы вернуть значение, отталкиваясь от первой. Возможно...

excel. создать таблицу значение кусочно-непрерывной функции y на интервале [xmin; xmax] с шагом h, для расчета функции y используя логические функции

Изобразить схематически график функции на интервале, зная знаки функции и 1 и 2 производной
Пожалуйста, проверте моё решение этих примеров: Изобразите схематически график функции f(x) над интервалом (а;b), если на (a;b)...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru