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

Монада State, использование modify из другой функции

15.05.2016, 13:11. Показов 844. Ответов 2

Студворк — интернет-сервис помощи студентам
Это скелет программы. Это основная функция которая вызывает другие

Haskell
1
2
3
4
5
6
State [Dec] [Dec]
mainCon = do
  acc <- get
  put []
  modify $ (++) [some func]
  return acc
Dec - из Templae Haskell

и на каком-то этапе вызывается:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
foldlWithKey'
                         (\list' key' val' ->
    if (...)
          then
                (Control.Monad.State.modify $ (Prelude.++) [elem]) >>
                some code
                : list')
          else
                some code
                : list')
                             )
                             []
                             (map')
То есть я из функции которая выше хочу модифицировать State из mainCon, продолжая обходить map'. И получается такая ошибка:

Haskell
1
2
3
No instance for (MonadState [Dec] [])
      arising from a use of ‘Control.Monad.State.modify’
    In the expression: Control.Monad.State.modify
Как можно просто решить эту проблему?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2016, 13:11
Ответы с готовыми решениями:

Монада State на примере
Читал статью про монады Кирпичёва, в частности, застрял на монаде State (почти не понял) и программе с её участием. rand :: State...

Монада State на примере автоматов
Здравствуйте, помогите разобраться с монадой State, на примере автоматов. Автомат для разбора дробного числа, принимает состояние и...

Использование функции как параметра другой функции
В задании указано, что функция P прибавляет значение функции ff к элементу массива, если он входит в промежуток от C до D, которые вводятся...

2
Модератор
 Аватар для Curry
5158 / 3488 / 536
Регистрация: 01.06.2013
Сообщений: 7,568
Записей в блоге: 9
15.05.2016, 13:53
Выражение (Prelude.++) [elem] явно не имеет тип [Dec] -> [Dec]. Сократите код до минимума, но что бы он давал ту же проблему, и что бы он был на Haskell, а не обрывки.
1
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
16.05.2016, 21:45
Почему так происходит:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- Это выражение имеет тип m (), при этом m удовлетворяет MonadState [a] m
*Main> :t Control.Monad.State.modify ((Prelude.++) [])
Control.Monad.State.modify ((Prelude.++) [])
  :: MonadState [a] m => m ()
 
-- Какой будет m Haskell пока еще не знает
 
-- Теперь добавим к нему выражение  ">> []", как делаете Вы
*Main> :t Control.Monad.State.modify ((Prelude.++) []) [B]>> [][/B]
    No instance for (MonadState [a0] []) arising from a use of ‘modify’
    In the first argument of(>>)’, namely ‘modify ((++) [])’
    In the expression: modify ((++) []) >> []
 
-- Т.к. список в Haskell тоже является монадой, а также находится в одном выражении с предыдущим
-- то Haskell успешно выводит тип неизвестного m и получает MonadState [a] []
-- Далее он просто не находит инстанс MonadState [a] [] и выдает ошибку
Как бороться? Если правильно понял, то хотите обойти Map, при этом меняя состояние внутри монады State
Haskell
1
2
3
4
5
-- Определите монадный foldlWithKey
foldlWithKeyM :: Monad m => (a -> k -> v -> m a) -> a -> Map k v -> m a
foldlWithKeyM f acc = foldlWithKey f' (return acc) 
  where
    f' ma k v = ma >>= \a -> f a k v
Теперь Ваш код будет работать. Все вычисления будет производится внутри монады State
Haskell
1
2
3
4
5
6
something1 = undefined
something2 = undefined
 
traverseMap :: Map k v -> State [a] [b]
traverseMap mp = foldlWithKeyM f [] mp
  where  f list' key' val' = Control.Monad.State.modify ((Prelude.++) [something1]) >> return [something2]
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.05.2016, 21:45
Помогаю со студенческими работами здесь

Использование значение функции в другой функции
Здарвствуйте.Задание:ввести три числа и программа выберает какое самое большой и самое маленькое и решает по формуле max/max^2+min/min^2 ...

Использование массива из функции в другой функции
как использовать полученный массив в другой функции. к примеру в функции int Mass(char *fname) происходит конвертация одномерного массива...

Использование переменной в функции другой функции
namespace ABCS { class Functions { public Functions() { } public static void Forma(object forma) ...

Использование файла в другой функции
Гугл никак не помог, хоть пути исправления ошибки LNK2001 там есть, но все не то. Конкретно, в чем дело. Есть два файла code.cpp и...

Использование функции из другой формы
Параллельно появился ещё один вопрос. Есть форма Form1, в которой есть таблица, обновляемая так же кнопкой. По кнопке, из Form1...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru