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

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

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

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

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

применены функции высшего порядка. Как во второй строке можно заменить символ "собака" (в коде (а), ставить нормальный символ почему-то запретили), может возможно иначе выполнить эту функцию?

также как-то не могу понять для чего функция aux и можно ли её заменить?


haskell Код:
import Char
data Key = Shift | CapsLock | ALN Char deriving Show

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 = 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

буду очень благодарна за помощь)
Ответить с цитированием
  (#2 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,274
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 28.11.2013, 23:47

Упростить - это в смысле написать громоздкими, но примитивными конструкциями?
Например, можно все функции переписать примерно в таком стиле:

haskell Код:
getRaw :: [Key] -> String
getRaw [] = []
getRaw ((ALN x) : t) = x : (getRaw t)
getRaw (_ : t) = getRaw t

isCapsLocked :: [Key] -> Bool
isCapsLocked []  = False
isCapsLocked (CapsLock : t) = not (isCapsLocked t)
isCapsLocked (_ : t) = isCapsLocked t
Ответить с цитированием
  (#3 (permalink)) Старый
Helly_hell Helly_hell вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2013
По умолчанию 29.11.2013, 22:29

Примерно такой стиль и подходит, но с функциями высшего порядка)
возможно?

Последний раз редактировалось Alexiski; 29.11.2013 в 23:52 Причина: Оверквотинг тут был совершенно излишен
Ответить с цитированием
  (#4 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,274
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 29.11.2013, 23:53

С функциями высшего порядка в таком стиле не очень пойдет. Такой стиль - явная рекурсия, а функции высшего порядка обрабатывают список сразу, без рекурсии.

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

Может, есть какой-нибудь пример, как это должно выглядеть?
Ответить с цитированием
  (#5 (permalink)) Старый
Helly_hell Helly_hell вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2013
По умолчанию 30.11.2013, 01:44

Цитата:
Сообщение от Alexiski Посмотреть сообщение
С функциями высшего порядка в таком стиле не очень пойдет. Такой стиль - явная рекурсия, а функции высшего порядка обрабатывают список сразу, без рекурсии.

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

Может, есть какой-нибудь пример, как это должно выглядеть?
Примера собственно говоря нет. Только если непосредственно с применением Filter, map, foldl и т.д.

Все же упростить, это я не правильно выразилась. Можно ли сделать этот вариант без aux и (а) ?
Ответить с цитированием
Ads.
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
4 дня до сдачи. Задачи по Haskell. Помогите! babai Haskell 0 04.11.2012 13:11
Ресурсы для программы Haskell Vladimir the Red Sunny Haskell 58 04.06.2012 09:52
Задачи на языке Haskell! gomon Haskell 2 21.01.2012 20:00
Использование комбинаторов в Haskell Undina Haskell 0 13.12.2011 12:53
Вложенный if then else в Haskell Елена_ Haskell 3 07.12.2011 10:52
Упростить программу lollipop Prolog 5 31.10.2011 14:06
Haskell после Пролога? pavelr Prolog 5 24.03.2011 22:29
Средства взаимодействия haskell Zambidis Haskell 4 15.12.2010 01:31
Как упростить? shor Prolog 10 29.11.2009 20:51
Как перевести программный код на Haskell winSistem32 Lisp 0 24.05.2008 18:59
Оптимизация хвостовой рекурсии в Haskell rv82 Мысли вслух 6 15.03.2008 10:02
Регулярные выражения: как упростить? feedbee PHP 5 08.08.2004 00:48



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