Здравствуйте, deniok, Вы писали:
D>Здравствуйте, lse, Вы писали:
lse>>Откровенно говоря, все, что мне нужно — это схематчески набросанный пример с окном, на котором кнопка, при нажатии на кнопку к глобальной коллекции происходит добавление нового числа. Один раз нажали — [1], второй раз нажали — [1,2], третий раз — [1,2,3].
D>Ну и напиши модификатор D>
D>modList lst@(x:xs) = (x+1):lst
D>
D>(Добавляют обычно в голову, если обязательно в хвост — добавь reverse, например.) D>И дёргай его при каждом нажатии.
D>А глобальной коллекции не бывает — старую передаёшь, новую получаешь. Нет объектов с identity
Как тогда хранить list между вызовами callback-ов?
Я знаю, что нет identity. Но не предсталвяю, как вот в этом случае можно обойтись без модификации.
псевдоязык, инициализация главного окна
initWindow =
Window window
List list
window.onClick=onclick list
как функция obclick "будет возвращать модифицированный объект"? если ты скажешь, я буду очень удивлен. тут единственный вариант — дать на вход ей ссылку на mutable-список. Как хранить list между вызовами callback-ов?
Здравствуйте, lse, Вы писали:
lse>Здравствуйте, lomeo, Вы писали:
L>>Ну, надо было, наверное, объяснить, что сам вопрос лишён смысла, потому что в Хаскеле нет последовательности действий, поэтому понятие "модификация" бессмысленно, если рассматривать функции как математические.
lse>Я знаю, что в чистых функциях все именно так.
L>>А тут и зиппер не нужен, цикл с состоянием (StateT MyState IO) в котором проверяются сигналы (скажем из входного потока) и передаются на обработчики (callback-и). Тогда callback может делать что-то вроде
L>>
lse>Если конкретнее — то это wxHaskell.
lse>Нужны пояснения.
lse>getObjectFromFile (fileNameFromSignal signal) — возвращает объект, соотв. файлу
lse>object <- liftIO $ .... — это что такое? что за liftIO?
Мы работает в StateT MyState IO, потому что нам надо работать с IO (работа с файлом). Для того, чтобы позвать обёрнутый трансформером IO делают liftIO. В данном случае он имеет тип IO Object -> StateT MyState IO Object, т.к. getObjectFromFile (fileNameFromSignal signal) :: IO Object.
lse>Откровенно говоря, все, что мне нужно — это схематчески набросанный пример с окном, на котором кнопка, при нажатии на кнопку к глобальной коллекции происходит добавление нового числа. Один раз нажали — [1], второй раз нажали — [1,2], третий раз — [1,2,3].
Что то вроде
do ref <- newIORef []
f <- frame [text := "lse test"]
incBtn <- button f [text := "Inc", on command := modifyIORef ref updateMyList]
printBtn <- button f [text := "Print", on command := (readIORef >>= print . reverse)]
where
updateMyList xs = (length xs) : xs
lse>а как на счет этого?
Замечательно, это именно то, что я и deniok тебе давали
Здравствуйте, lomeo, Вы писали:
L>Здравствуйте, lse, Вы писали:
lse>>Как тогда хранить list между вызовами callback-ов?
L>Хранить надо ссылку. Её то можно модифицировать (менять значение, на которое оно ссылается).
Ну а я о чем говорю уже 2 часа? Это-то и нужно было. Ссылка на объект — самое то. А тут говорят — ссылки запрещены.
lse>Как тогда хранить list между вызовами callback-ов? lse>Я знаю, что нет identity. Но не предсталвяю, как вот в этом случае можно обойтись без модификации.
В WxHaskell действительно никак.
Unlike more functional GUI libraries, wxHaskell does not provide a model for state management and uses simple mutable variables to communicate state across different event handlers. (Note: this is a concious design decision – as functional GUI interfaces are still very much a research area, we want to provide a full fledged GUI library using simple IO first, than try to build good functional interfaces on top of that).