Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Haskell
Перезагрузить страницу Как правильно работать с пользовательскими типами
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
amorita amorita вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.10.2010
По умолчанию Как правильно работать с пользовательскими типами - 19.10.2010, 16:56

Помогите,пожалуйста, с лабораторной!!!

Клавиши на клавиатуре могут быть либо управляющими,либо алфавитно-цифровыми. Нажатие алфавитно-цифровой клавиши может сопровождаться нажатием клавиши Shift. Из упрвляющих клавиш интересует тоько клавиша CapsLock,остальные можно не различать. Каждое нажатие алфавитно-цифровой клавиши несет с собой информацию в виде символа. После нажатия CapsLock последующие символы переводятся в верхний регистр (если они не были нажаты вместе с Shift) до следующего нажатия CapsLock. Если режим CapsLock не активирован, символы нажатые с Shift.переводятся в верхний регистр. Нужно разработать тип данных, представляющий указанную информацию. Последовательность нажатий клавиш представляется в виде списка. Основная задача состоит в том, чтобы разработать функцию, переводящую эту последовательность в строку символов. Например, поседовательность нажатий

Shift+'h' 'e' CapsLock 'l' 'l' Shift+'o' CapsLock

должна дать в результате строку Hello. Определить след. функции:

1) getALNum, возвращающая из списка нажатий только нажатия алфавитно-цифровых клавиш.

2) getRaw, возвращающая строку, составленную из нажатых символов без учета информации о Shift и CapsLock.

3)isCapsLocked, по последовательности нажатий определяющая, остался ли после нее режим CapsLock в активированном состоянии.

4) getString, переводящая последовательность нажатий в строку.

при реализации функций можно воспользоваться стандартными функциями toUpper и toLower, переводящими символ в верхний и нижний регистры соответственно. Они определены в модуле Char: чтобы их использовать, добавьте в начало программы строчку:

import Char
Ответить с цитированием
  (#2 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 19.10.2010, 18:19

Цитата:
Сообщение от amorita Посмотреть сообщение
Помогите,пожалуйста, с лабораторной!!!
Код:
data Key = Shift | CapsLock | ALN Char 

getALNum :: [Key] -> [Key]
getALNum xs = [x |x @ (ALN _) <- xs]

getRaw :: [Key] -> String
getRaw xs = [x | ALN x <- xs]

isCapsLocked :: [Key] -> Bool
isCapsLocked xs = foldl aux False xs where
  aux a key = 
    case key of 
      CapsLock -> not a
      _        ->     a



getString :: [Key] -> String
getString xs = result [] where
  aux (f, caps, shift) key = 
    case key of ALN c -> 
                  if caps == shift then
                    (f . (toLower c :) , caps, False)
                  else
                    (f . (toUpper c :) , caps, False)
                
                Shift    -> (f,     caps, True)
                CapsLock -> (f, not caps, False)
  
  (result, _, _) = foldl aux (id, False, False) xs


Don't fear the Monad
Ответить с цитированием
  (#3 (permalink)) Старый
amorita amorita вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.10.2010
Smile 19.10.2010, 19:32

огромное спасибо, выручили)))
Ответить с цитированием
  (#4 (permalink)) Старый
amorita amorita вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.10.2010
По умолчанию 07.11.2010, 15:28

Извините, еще раз побеспокою, функция getALNum почему-то не работает и еще вопос что означает aux ?
Ответить с цитированием
  (#5 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 07.11.2010, 20:58

Цитата:
Сообщение от amorita Посмотреть сообщение
Извините, еще раз побеспокою, функция getALNum почему-то не работает
как именно не работает?
Код:
*Main> getALNum [Shift, CapsLock, ALN 'a', Shift, ALN 'b']
[ALN 'a',ALN 'b']
Цитата:
и еще вопос что означает aux ?
имя вспомогательной функции.


Don't fear the Monad
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
amorita amorita вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.10.2010
По умолчанию 08.11.2010, 10:10

А мне почемцу-то программа пишет
Main> getALNum [Shift, CapsLock, ALN 'a', Shift, ALN 'b']

ERROR - Cannot find "show" function for:
*** Expression : getALNum [Shift,CapsLock,ALN 'a',Shift,ALN 'b']
*** Of type : [Key]
Ответить с цитированием
  (#7 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 08.11.2010, 10:18

Цитата:
Сообщение от amorita Посмотреть сообщение
А мне почемцу-то программа пишет
Main> getALNum [Shift, CapsLock, ALN 'a', Shift, ALN 'b']

ERROR - Cannot find "show" function for:
*** Expression : getALNum [Shift,CapsLock,ALN 'a',Shift,ALN 'b']
*** Of type : [Key]
Код:
data Key = Shift | CapsLock | ALN Char deriving Show


Don't fear the Monad
Ответить с цитированием
  (#8 (permalink)) Старый
amorita amorita вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.10.2010
Talking 08.11.2010, 15:21

Ааааа вы просто чудо, огромное спасибо всё заработало)))))))) низкий принизкий поклон вам
Ответить с цитированием
  (#9 (permalink)) Старый
amorita amorita вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.10.2010
По умолчанию 16.11.2010, 11:06

А возможно ли сделать эту же задачу без использования функций высшего порядка типа foldl, то есть прямой проход по списку? просто мне нужно оба варианта))
Ответить с цитированием
  (#10 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 16.11.2010, 11:47

haskell Код:
isCapsLocked :: [Key] -> Bool
isCapsLocked [] = False
isCapsLocked (x:xs) = aux (isCapsLocked xs) x where
  aux a key =
    case key of
      CapsLock -> not a
      _        ->     a



getString :: [Key] -> String
getString xs = result [] where
  aux []         b                = b
  aux (key:keys) (f, caps, shift) =
    aux keys (case key of ALN c ->
                            if caps == shift then
                              (f . (toLower c :) , caps, False)
                            else
                              (f . (toUpper c :) , caps, False)
                          Shift    -> (f,     caps, True)
                          CapsLock -> (f, not caps, False))
   
 

  (result, _, _) = aux xs (id, False, False)


Don't fear the Monad
Ответить с цитированием
  (#11 (permalink)) Старый
amorita amorita вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.10.2010
По умолчанию 16.11.2010, 21:07

Если не затруднит, не могли бы пояснить эту функцию, а то никак не разберу как она работает, прям по строчно если можно:0
Цитата:
getString :: [Key] -> String
getString xs = result [] where
aux [] b = b
aux (key:keys) (f, caps, shift) =
aux keys (case key of ALN c ->
if caps == shift then
(f . (toLower c , caps, False)
else
(f . (toUpper c , caps, False)
Shift -> (f, caps, True)
CapsLock -> (f, not caps, False))


(result, _, _) = aux xs (id, False, False)
Ответить с цитированием
  (#12 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 17.11.2010, 11:01

Вот так будет понятней:
haskell Код:
getString'' :: [Key] -> String
getString'' xs = aux xs (False, True) where
  aux [] b = []
  aux (key:keys) (caps, shift) = case key of
    ALN c ->
      (if caps == shift
       then toLower c  
       else toUpper c) : aux keys (caps, False)
    Shift    -> aux keys (    caps, True)
    CapsLock -> aux keys (not caps, False)


Don't fear the Monad
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
amorita amorita вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.10.2010
По умолчанию 22.11.2010, 16:01

о отлично, тперь намного рпоще, а еще можно её сделать с помощью функций высшего порядка, именно вот этот упрощенный вариант))))
Ответить с цитированием
  (#14 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 22.11.2010, 16:25

Цитата:
Сообщение от amorita Посмотреть сообщение
о отлично, тперь намного рпоще, а еще можно её сделать с помощью функций высшего порядка, именно вот этот упрощенный вариант))))
haskell Код:
getString'' :: [Key] -> String
getString'' xs = reverse result where
  aux (str, caps, shift) key  = case key of
    ALN c ->
      ((if caps == shift
        then toLower c  
        else toUpper c) : str, caps, False)
    Shift    -> (str,     caps, True)
    CapsLock -> (str, not caps, False)
   
  (result, _, _) = foldl aux ([], False, True) xs


Don't fear the Monad
Ответить с цитированием
  (#15 (permalink)) Старый
markel markel вне форума
Member
 
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.12.2011
По умолчанию 15.12.2011, 00:12

у меня выдает две ошибки 1. not in scope: 'toUpper' 2. not in scope 'toLower'
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно работать с VBA Oksi4ka Visual Basic 0 20.05.2011 12:54
Как правильно работать на php Илья Агарков Вопросы начинающих программистов 0 28.03.2011 12:49
XOR как правильно с ним работать ravmad С/С++ 4 03.06.2009 00:36
Как правильно работать с eVC++ fatboy Windows CE 15 31.03.2006 20:25
RIL как правильно с ним работать ankazakov Windows CE 0 09.03.2006 12:33
JSF EL как с ней правильно работать artgonch Java 0 26.12.2005 08:47
Как правильно работать с cgi x5u1t DHTML, JavaScript, VBScript 2 26.12.2005 01:43
Как правильно работать в Dev-C++ DSD Мультиплатформенные библиотеки 1 14.09.2005 12:58
Как правильно работать с LPT Anton S Железо. Написание драйверов 4 04.06.2005 04:15
Как правильно работать с типами данных EUGIX .NET 4 26.08.2004 10:59
Как правильно работать с lsp Anonymous Visual C++ 0 20.08.2003 20:32
Как организовать обмен пользовательскими «сообщениями»между классами void Visual C++ 6 30.07.2003 02:46



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов