Re[8]: Так в чем же принципиальные отличия ФП от ИП?
От: deniok Россия  
Дата: 10.05.07 18:22
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>не получилось


Ну вот тебе ещё (сегодня родилось по ходу болтовни в ЖЖ)

-- универсальный "поднимальщик" бинарных операторов на point-free уровень
upBinop :: (a -> b -> c) -> (d -> a) -> (d -> b) -> (d -> c)
upBinop binop p q x = binop (p x) (q x)

-- поднимаем логические операторы
(&&&) :: (a -> Bool) -> (a -> Bool) -> (a -> Bool)
(&&&) = upBinop (&&)

(|||) = upBinop (||)

-- пользуемся поднятыми операторами для point-free конструирования предикатов
isAlphaSpace = isAlpha ||| isSpace
Re[6]: Так в чем же принципиальные отличия ФП от ИП?
От: Gaperton http://gaperton.livejournal.com
Дата: 10.05.07 18:25
Оценка: +1 :))
Здравствуйте, Константин Л., Вы писали:

КЛ>Ладно, мой поинт в том, что оо+фя гораздо привлекательнее и "живучее" чем чистые фя.


Так это вполне нормальный пойнт . У меня пойнт оф вью, что характерно, зе сэйм. Однако с остальным содержимым твоих постов я при этом не согласен . Прикольно, однако .
Re[11]: Так в чем же принципиальные отличия ФП от ИП?
От: Gaperton http://gaperton.livejournal.com
Дата: 10.05.07 18:37
Оценка: :)
Здравствуйте, palm mute, Вы писали:

PM>Здравствуйте, Gaperton, Вы писали:


G>>б) в чистом Хаскеле можно при желании писать императивный код в IO- или ST- монаде, засунув состояние куда-нибудь в IORef.

G>>Попробуй решить проблему в моем примере. Кольцо из объектов, измени состояние. Посмотрим, что у тебя получится, и насколько это будет практично. К слову — пока ни у кого не получалось . Что не удивительно — получиться это не может.

PM>Оно? Или ты что-то более сложное имел в виду? Прошу обратить внимание на 'deriving Eq' и 'obj `elem` visited' — это обещанная Identity. Полиморфизму сверху добавить тоже можно.


Похоже. Прикольная штука этот ваш IORef. Надо разобраться, я пока не до конца фкуриваю, как оно работает.

PM>з.ы. Я не говорю, что так нужно делать, но можно — факт
Re[11]: Так в чем же принципиальные отличия ФП от ИП?
От: R.K. Украина  
Дата: 10.05.07 21:05
Оценка: 18 (2)
Здравствуйте, palm mute, Вы писали:

PM>Здравствуйте, Gaperton, Вы писали:


G>>б) в чистом Хаскеле можно при желании писать императивный код в IO- или ST- монаде, засунув состояние куда-нибудь в IORef.

G>>Попробуй решить проблему в моем примере. Кольцо из объектов, измени состояние. Посмотрим, что у тебя получится, и насколько это будет практично. К слову — пока ни у кого не получалось . Что не удивительно — получиться это не может.

[skip]
PM>з.ы. Я не говорю, что так нужно делать, но можно — факт

Можно сделать и попроще. Вот так:
import Data.IORef
import Control.Monad
import Control.Monad.Fix

data Loop a = Loop a (IORef (Loop a))

seed n = mfix $ liftM (Loop n) . newIORef

(Loop _ ref) `intro` n = do
    a <- readIORef ref
    c <- liftM (Loop n) $ newIORef a
    writeIORef ref c

readLoop (Loop n init) = cons n init
    where
    cons n ref = liftM (n:) $ readIORef ref >>= intern
    intern (Loop n ref) = if ref==init then return [] else cons n ref

main = do
    oo <- seed 5
    mapM_ (oo `intro`) [8,6,7,9,4,2,0,1,3]
    readLoop oo >>= print

Получается односвязный список с возможной простой модификацией в двусвязный (просто добавить в тип еще один IORef и слегка подправить seed и intro).
You aren't expected to absorb this
Re[12]: Так в чем же принципиальные отличия ФП от ИП?
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 10.05.07 21:39
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

G>Похоже. Прикольная штука этот ваш IORef. Надо разобраться, я пока не до конца фкуриваю, как оно работает.


Да ссылка обычная, только завернутая в IO. В смысле, работать с ней можно только там (это не совсем так, но в данном случае непринципиально).
Погляди на типы функций:

newIORef :: IO (IORef a)
readIORef :: IORef a -> IO a
writeIORef :: IORef a -> a -> IO a


Должно стать понятно. Т.е. там в любом случае приходится работать в IO, поэтому сохраняется чистота, но одновременно можем менять состояние (такое вот противоречие).

Вообще, для практического использования Хаскеля обязательная к прочтению вещь:
Tackling the awkward squad
Re[7]: Так в чем же принципиальные отличия ФП от ИП?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.05.07 22:40
Оценка:
Здравствуйте, Gajdalager, Вы писали:

VD>>Жаль, правда, что код не идентичный.

G>Почему?

Мог бы и сам догадаться

Потому, что мап преобразует один список в другой, а не прсото вызвает функцию для каждого элемента спска. На то он и map — отображение.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Так в чем же принципиальные отличия ФП от ИП?
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.05.07 00:38
Оценка: :)
Здравствуйте, palm mute, Вы писали:

PM>з.ы. Я не говорю, что так нужно делать, но можно — факт


А тут девочке еще советовали тему для лабы "Метапрограммирование на шаблонах С++ как средсво шифрования кода". С++ морально устраел для этих целй. ООП на Хаскеле явно его победит.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Так в чем же принципиальные отличия ФП от ИП?
От: Трурль  
Дата: 11.05.07 05:29
Оценка:
Здравствуйте, palm mute, Вы писали:

PM>Оно?

Наглое жульничество . Вот напиши ка определение writeIORef на хаскеле.
Re[13]: Так в чем же принципиальные отличия ФП от ИП?
От: Mirrorer  
Дата: 11.05.07 05:54
Оценка: :))
Здравствуйте, lomeo, Вы писали:

L>поэтому сохраняется чистота, но одновременно можем менять состояние (такое вот противоречие).


Угу. Из той же серии что и звук хлопка одной ладонью.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[12]: Так в чем же принципиальные отличия ФП от ИП?
От: palm mute  
Дата: 11.05.07 07:34
Оценка: 1 (1)
Здравствуйте, Трурль, Вы писали:

PM>>Оно?

Т>Наглое жульничество . Вот напиши ка определение writeIORef на хаскеле.
Да ну, Трурль, уж ты то должен знать, где искать .
http://darcs.haskell.org/ghc-6.6/packages/base/GHC/IOBase.lhs
-- |Write a new value into an 'IORef'
writeIORef  :: IORef a -> a -> IO ()
writeIORef (IORef var) v = stToIO (writeSTRef var v)


Следующей просьбой будет, полагаю, реализовать stToIO и writeSTRef. И, естественно, в конце концов мы дойдем до примитивов, реализованных на C и C-- в рантайме. Но ты же не будешь утверждать, что C++, например, не поддерживает присваивания на том основании, что нельзя реализовать на C++ оператор присваивания для встроенных типов.
Re[12]: Так в чем же принципиальные отличия ФП от ИП?
От: deniok Россия  
Дата: 11.05.07 07:36
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>Здравствуйте, palm mute, Вы писали:


PM>>Оно?

Т>Наглое жульничество . Вот напиши ка определение writeIORef на хаскеле.

writeIORef  :: IORef a -> a -> IO ()
writeIORef (IORef var) v = stToIO (writeSTRef var v)


Re[12]: Так в чем же принципиальные отличия ФП от ИП?
От: palm mute  
Дата: 11.05.07 07:45
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>А тут девочке еще советовали тему для лабы "Метапрограммирование на шаблонах С++ как средсво шифрования кода". С++ морально устраел для этих целй. ООП на Хаскеле явно его победит.


Я вот по-португальски тоже ничего не понимаю. Странный язык, непонятный. Как на нем люди разговаривают, да еще и песни пишут, загадка.
Re[8]: Так в чем же принципиальные отличия ФП от ИП?
От: Mamut Швеция http://dmitriid.com
Дата: 11.05.07 08:27
Оценка:
VD>Мог бы и сам догадаться

VD>Потому, что мап преобразует один список в другой, а не прсото вызвает функцию для каждого элемента спска. На то он и map — отображение.


Ну, в JavaScript'е (который там приведен) это одно и то же

Обычно в JS map реализуется так:
function map(arr, fn)
{
    for(i = 0; i < arr.length; i++)
    {
        fn(arr[i]);
    }
}


Чтобы голову не заморачивать


dmitriid.comGitHubLinkedIn
Re[11]: Так в чем же принципиальные отличия ФП от ИП?
От: Gaperton http://gaperton.livejournal.com
Дата: 11.05.07 08:27
Оценка:
Здравствуйте, palm mute, Вы писали:

PM>Здравствуйте, Gaperton, Вы писали:


G>>б) в чистом Хаскеле можно при желании писать императивный код в IO- или ST- монаде, засунув состояние куда-нибудь в IORef.

G>>Попробуй решить проблему в моем примере. Кольцо из объектов, измени состояние. Посмотрим, что у тебя получится, и насколько это будет практично. К слову — пока ни у кого не получалось . Что не удивительно — получиться это не может.

PM>Оно? Или ты что-то более сложное имел в виду? Прошу обратить внимание на 'deriving Eq' и 'obj `elem` visited' — это обещанная Identity. Полиморфизму сверху добавить тоже можно.

PM>з.ы. Я не говорю, что так нужно делать, но можно — факт

Дружище, спасибо. Посмотрел. Три вопроса.

1) Ромбик мне из объектов не изобразите? Чтобы два иорефа в структуре данных на один объект указывали. Зело хоцца на идентити в действии поглядеть.
2) Потому как идентити я у вас таки не нашел. То что вы говорите про идентити — это не похоже на идентити. Поэтому...
3) ...Будьте любезны, выпишите сингнатуры всех функций и структур данных. Это поможет в поисках идентити, а то я не умею в уме монадные типы выводить.
Re[12]: Так в чем же принципиальные отличия ФП от ИП?
От: palm mute  
Дата: 11.05.07 08:53
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>1) Ромбик мне из объектов не изобразите? Чтобы два иорефа в структуре данных на один объект указывали. Зело хоцца на идентити в действии поглядеть.

Да хоть 10.
import Data.IORef
import Control.Monad

type IntPointer = IORef Int

createPtr :: Int -> IO IntPointer
createPtr = newIORef

deref :: IntPointer -> IO Int
deref = readIORef

assign :: IntPointer -> Int -> IO ()
assign = writeIORef

derefList :: [IntPointer] -> IO [Int]
derefList = mapM deref

printPtrs :: [IntPointer] -> IO ()
printPtrs ptrs = derefList ptrs >>= print

main = do
  ptr <- createPtr 1
  let ptrs = replicate 10 ptr
  printPtrs ptrs -- prints [1,1,1,1,1,1,1,1,1,1]
  assign ptr 2
  printPtrs ptrs -- prints [2,2,2,2,2,2,2,2,2,2]
  assign ptr 3
  printPtrs ptrs -- prints [3,3,3,3,3,3,3,3,3,3]

IORef — это обычный указатель, writeIORef — это обычное деструктивное присваивание, readIORef — самое обычное разыменование указателя, один-в-один как на С++. Все, что можно делать с указателями, можно делать с IORef'ами. Но естественно, что это безобразие за пределы IO не выпускают. А над STRef можно, например, грязно императивно надругаться, а потом заморозить, превратить в нормальное неизменяемое значение (хотя это скорее для оптимизации узких мест подойдет, объектную декомпозицию так не сделать, если объекты должны жить на протяжении всей работы программы).

G>2) Потому как идентити я у вас таки не нашел. То что вы говорите про идентити — это не похоже на идентити. Поэтому...

Объясните, как вы понимаете идентити.
G>3) ...Будьте любезны, выпишите сингнатуры всех функций и структур данных. Это поможет в поисках идентити, а то я не умею в уме монадные типы выводить.
Примера выше достаточно, я думаю.
Re[13]: Так в чем же принципиальные отличия ФП от ИП?
От: Gaperton http://gaperton.livejournal.com
Дата: 11.05.07 09:44
Оценка:
Здравствуйте, palm mute, Вы писали:

G>>2) Потому как идентити я у вас таки не нашел. То что вы говорите про идентити — это не похоже на идентити. Поэтому...

PM>Объясните, как вы понимаете идентити.

Идентити — это, в принципе и есть обычный указатель в гражданских языках. Это некий уникальный ID, обозначающий экземпляр класса — объект. Идентити можно сравнивать отдельно от объектов, идентити применяется для ссылок на объекты, по идентити можно получить сам объект, и изменить его состояние.

Пример экзотического идентити, не являющегося указателем — в Эрланге роль идентити выполняет идентификатор процесса. Объекты же симулируются бесконечно рекурсивными процессами, которые хранят на стеке состояние (передавая его параметром в бесконечной рекурсии), и, зная идентити (PID) друг друга, посылают друг другу сообщения. Это объектная система — в точности такая же модель была в Smalltalk 72.

Пример системы, где состояние симулируется, а идентити отсутствует — когда мы на Хаскеле заводим систему из бесконечно рекурсивных функций, связанных по входам-выходам бесконечными ленивыми списками. Здесь — состояние так же хранится в параметрах бесконечно рекурсивных функций, а ленивые списки представляют собой как бы временной ряд из сообщений. Похоже на случай Эрланга, но идентити нет. Это не объектная система, объектную декомпозицию здесь уже сделать нельзя, она выполняется по другому.

G>>3) ...Будьте любезны, выпишите сингнатуры всех функций и структур данных. Это поможет в поисках идентити, а то я не умею в уме монадные типы выводить.

PM>Примера выше достаточно, я думаю.

В принципе, да. Спасибо, посмотрю.
Re[13]: Так в чем же принципиальные отличия ФП от ИП?
От: Трурль  
Дата: 11.05.07 12:13
Оценка:
Здравствуйте, palm mute, Вы писали:

PM>Здравствуйте, Трурль, Вы писали:


PM>Следующей просьбой будет, полагаю, реализовать stToIO и writeSTRef.

Однако, шаман русский.
PM>Но ты же не будешь утверждать, что C++, например, не подерживает присваивания на том основании, что нельзя реализовать на C++ оператор присваивания для встроенных типов.
Не буду. А если бы стал, то меня ткнули бы носом в п. 5.17.
Re[14]: Так в чем же принципиальные отличия ФП от ИП?
От: palm mute  
Дата: 11.05.07 12:22
Оценка:
Здравствуйте, Трурль, Вы писали:

PM>>Следующей просьбой будет, полагаю, реализовать stToIO и writeSTRef.

Т>Однако, шаман русский.
Даруйте, пане, я щирий українець.

PM>>Но ты же не будешь утверждать, что C++, например, не подерживает присваивания на том основании, что нельзя реализовать на C++ оператор присваивания для встроенных типов.

Т>Не буду. А если бы стал, то меня ткнули бы носом в п. 5.17.
Ничего опровергающего мои слова я там не нашел. Или это было согласие?
Re[13]: Так в чем же принципиальные отличия ФП от ИП?
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.05.07 12:48
Оценка:
Здравствуйте, palm mute, Вы писали:

VD>>А тут девочке еще советовали тему для лабы "Метапрограммирование на шаблонах С++ как средсво шифрования кода". С++ морально устраел для этих целй. ООП на Хаскеле явно его победит.


PM>Я вот по-португальски тоже ничего не понимаю. Странный язык, непонятный. Как на нем люди разговаривают, да еще и песни пишут, загадка.


Ды, ты, как я погляжу, много чего не понимаешь. Вот смысл моего сообщения не понял. На замечание о ужасности и громоздкости кода начинашь о знаниях языка рассуждать. Так что не расстраивайся. Нельзя же понимать все?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Так в чем же принципиальные отличия ФП от ИП?
От: Трурль  
Дата: 11.05.07 13:13
Оценка: :))
Здравствуйте, palm mute, Вы писали:

PM>Даруйте, пане, я щирий українець.

Для нас, чукчей, вы все на одно лицо.

PM>>>Но ты же не будешь утверждать, что C++, например, не подерживает присваивания на том основании, что нельзя реализовать на C++ оператор присваивания для встроенных типов.

Т>>Не буду. А если бы стал, то меня ткнули бы носом в п. 5.17.
PM>Ничего опровергающего мои слова я там не нашел. Или это было согласие?
Упс, п. 5.17. ISO 14882. Ну да, согласие. Присваивания C++ подерживает и я не буду утверждать обратного.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.