Здравствуйте, FallenGameR, Вы писали:
FGR>Про то что nemerle заморожен узнал только что. FGR>Но вопрос был о другом — вообще о перспективе функциональных языков на .net
Открою маленькую тайну: в чисто функциональных языках первоклассная сущность функций сохраняется вплоть до рантайма: указатели на данные и на код вычисляющий эти данные эквивалентны и вообще неразличимы Это реализуется, например, G-машиной (STG в случае компилятора GHC языка Haskell). Поэтому на дотнете возможна только эмуляция такой "глубокой" чистой функциональности — той или иной степени успешности. В свете этого я думаю, что C# — наиболее перспективный "функциональный" (на синтаксическом уровне) язык
ЗЫ: Я совершенно не имею желания спорить о том, что круче. С большим уважением отношусь к Nemerle и F# и их замечательным командам.
Здравствуйте, deniok, Вы писали:
D>Открою маленькую тайну: в чисто функциональных языках первоклассная сущность функций сохраняется вплоть до рантайма: указатели на данные и на код вычисляющий эти данные эквивалентны и вообще неразличимы
А что это меняет с точки зрения пользователя языка?
И вообще какие есть полезные следствия у этого факта?
now playing: Fergie — Senderon
Re[2]: Функция как первоклассная сущность для рантайма
Здравствуйте, EvilChild, Вы писали:
EC>Здравствуйте, deniok, Вы писали:
D>>Открою маленькую тайну: в чисто функциональных языках первоклассная сущность функций сохраняется вплоть до рантайма: указатели на данные и на код вычисляющий эти данные эквивалентны и вообще неразличимы EC>А что это меняет с точки зрения пользователя языка? EC>И вообще какие есть полезные следствия у этого факта?
Это даёт пользователю языка понимание того, как исполняется его программа. То что в C массив плотно лежит в памяти, в C++ вызов виртуальных функций осуществляется косвенно, через VTBL, а шаблоны инстанциируются во время компиляции, а в дотнете и джаве динамическая память освобождается с помощью GC и нет детерминированного деструктора — все эти знания помогают писать эффективные программы и расшивать узкие места. Так же и в Хаскелле — понимание того, какие thunk'и сконструируются в рантайме при исполнении кода, позволяет не нарываться на избыточные space leaks.
Re[3]: Функция как первоклассная сущность для рантайма
Здравствуйте, deniok, Вы писали:
D>Это даёт пользователю языка понимание того, как исполняется его программа. То что в C массив плотно лежит в памяти, в C++ вызов виртуальных функций осуществляется косвенно, через VTBL, а шаблоны инстанциируются во время компиляции, а в дотнете и джаве динамическая память освобождается с помощью GC и нет детерминированного деструктора — все эти знания помогают писать эффективные программы и расшивать узкие места. Так же и в Хаскелле — понимание того, какие thunk'и сконструируются в рантайме при исполнении кода, позволяет не нарываться на избыточные space leaks.
Это на семантику влияет или нет? Насколько я понимаю то, как создаются санки в Хаскеле зависит от реализации.
Вот левая и правая свёртки списка по разному используют память. Это артефакт реализации и от семантики никак не зависит?
now playing: Robert Babicz — Look
Re[4]: Функция как первоклассная сущность для рантайма
Здравствуйте, EvilChild, Вы писали:
EC>Это на семантику влияет или нет? Насколько я понимаю то, как создаются санки в Хаскеле зависит от реализации.
Механизм вызова виртуальных функций в C++ тоже зависит от реализации и не документирован в стандарте Но все применяют единственную реализацию (естественную для стандартной архитектуры рантайма).
EC>Вот левая и правая свёртки списка по разному используют память. Это артефакт реализации и от семантики никак не зависит?
Это прямо следует из нормального порядка редукций и ленивости.
Если свёртываемая функция строга по своему второму аргументу, то для foldr для нее требуется линейный по размеру списка стек. В этом случае эффективен foldl' (со строгостью внутри). Если функция не строга по второму аргументу, то стоит использовать foldr для бесконечных списков и/или обработки входных списков поточным образом. Все прелести ленивости при этом сохраняются.
Здравствуйте, Курилка, Вы писали:
К>Ты имеешь в виду foldl для ленивого языка?
Для языка с поддержкой пользовательской ленивости. Для тотально строгого языка разницы между foldl и fold' нет. Идея в том, что отсутствие строгости применения левой свертке не несет никаких бенефитов:
foldl' f a [] = a
foldl' f a (x:xs) = let a' = f a x in a' `seq` foldl' f a' xs
Ну уберёшь ты отсюда seq — вместо уже возможного вычисления значения f a x повиснет thunk. Только до него не добраться, он спрятан за следующим вызовом foldl, и будет спрятан, пока ты весь список не разберёшь.
Здравствуйте, deniok, Вы писали:
D>Здравствуйте, Курилка, Вы писали:
К>>Ты имеешь в виду foldl для ленивого языка?
D>Для языка с поддержкой пользовательской ленивости. Для тотально строгого языка разницы между foldl и fold' нет.
Ну об этом и был вопрос, просто слишком обобщённо про ошибки не стоит говорить
Re: Функция как первоклассная сущность для рантайма
Здравствуйте, deniok, Вы писали:
D>Открою маленькую тайну: в чисто функциональных языках первоклассная сущность функций сохраняется вплоть до рантайма: указатели на данные и на код вычисляющий эти данные эквивалентны и вообще неразличимы Это реализуется, например, G-машиной (STG в случае компилятора GHC языка Haskell). Поэтому на дотнете возможна только эмуляция такой "глубокой" чистой функциональности — той или иной степени успешности.
Функциональность глубокая и чистая. Прямо романтический образ какой-то А языки с энергичной семантикой функциональными, глубокими и чистыми уже не считаются ? Что касается эмуляции, то чем net как система команд принципиально отличается от нативного x86 c этой точки зрения ? Если нечем, то получается что глубокая и чистая функциональность и на x86 недостижимый идеал. И вообще нет в жизни шасья, одна только эмуляция
Re[2]: Функция как первоклассная сущность для рантайма
Здравствуйте, chukichuki, Вы писали:
C>Здравствуйте, deniok, Вы писали:
D>>Открою маленькую тайну: в чисто функциональных языках первоклассная сущность функций сохраняется вплоть до рантайма: указатели на данные и на код вычисляющий эти данные эквивалентны и вообще неразличимы Это реализуется, например, G-машиной (STG в случае компилятора GHC языка Haskell). Поэтому на дотнете возможна только эмуляция такой "глубокой" чистой функциональности — той или иной степени успешности.
C>Функциональность глубокая и чистая. Прямо романтический образ какой-то А языки с энергичной семантикой функциональными, глубокими и чистыми уже не считаются ? Что касается эмуляции, то чем net как система команд принципиально отличается от нативного x86 c этой точки зрения ? Если нечем, то получается что глубокая и чистая функциональность и на x86 недостижимый идеал. И вообще нет в жизни шасья, одна только эмуляция
Я не очень хорошо знаю дотнет, но полагаю уровнем. Например, тот memory management, который в CLR имеется, не заточен под чистые функциональные языки.
Re[7]: Функция как первоклассная сущность для рантайма
Здравствуйте, deniok, Вы писали:
D>Здравствуйте, Курилка, Вы писали:
К>>Ты имеешь в виду foldl для ленивого языка?
D>Для языка с поддержкой пользовательской ленивости. Для тотально строгого языка разницы между foldl и fold' нет. Идея в том, что отсутствие строгости применения левой свертке не несет никаких бенефитов: D>
D>foldl' f a [] = a
D>foldl' f a (x:xs) = let a' = f a x in a' `seq` foldl' f a' xs
D>
D>Ну уберёшь ты отсюда seq — вместо уже возможного вычисления значения f a x повиснет thunk. Только до него не добраться, он спрятан за следующим вызовом foldl, и будет спрятан, пока ты весь список не разберёшь.
Прикольные все-таки релятивистские эффекты возникают в ленивых языках — не перстаю удивляться . Главное ведь — на ровном месте практически .
Re[8]: Функция как первоклассная сущность для рантайма
Здравствуйте, Gaperton, Вы писали:
G>Прикольные все-таки релятивистские эффекты возникают в ленивых языках — не перстаю удивляться . Главное ведь — на ровном месте практически .
Хорошо не квантово-механические, а то были бы thunk'и, которые вычислены и не вычислены одновременно
На самом деле в компиляторе есть анализатор строгости, который диктует вычислять то, что в любых контекстах должно быть вычислено. Но ему далеко не всё по зубам.
Re[9]: Функция как первоклассная сущность для рантайма
Здравствуйте, deniok, Вы писали:
D>Здравствуйте, Gaperton, Вы писали:
G>>Прикольные все-таки релятивистские эффекты возникают в ленивых языках — не перстаю удивляться . Главное ведь — на ровном месте практически .
D>Хорошо не квантово-механические, а то были бы thunk'и, которые вычислены и не вычислены одновременно
Дак может доживём до квантовых компьютеров и появятся?
D>На самом деле в компиляторе есть анализатор строгости, который диктует вычислять то, что в любых контекстах должно быть вычислено. Но ему далеко не всё по зубам.
Дак если бы по зубам было бы, то получили бы "прелести" TFP
А что за анализатор? Пальцем не ткнёшь, а то не совсем понимаю где искать (стопудово есть в хаскель-вики небось), точнее как.
Re[10]: Функция как первоклассная сущность для рантайма
Здравствуйте, Курилка, Вы писали:
К>Дак если бы по зубам было бы, то получили бы "прелести" TFP К>А что за анализатор? Пальцем не ткнёшь, а то не совсем понимаю где искать (стопудово есть в хаскель-вики небось), точнее как.
Я несколько месяцев назад пытался искать, начиная отсюда, но в документации по GHC очень это довольно скупо описано.
Re[11]: Функция как первоклассная сущность для рантайма
Здравствуйте, deniok, Вы писали:
D>Я несколько месяцев назад пытался искать, начиная отсюда, но в документации по GHC очень это довольно скупо описано.
Мда...
Ясно что что-то есть (и даже в GHCi), но как это что-то "руками попробовать" что-то не догоняю.
Не просветишь чайника?
Re[12]: Функция как первоклассная сущность для рантайма
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, deniok, Вы писали:
D>>Я несколько месяцев назад пытался искать, начиная отсюда, но в документации по GHC очень это довольно скупо описано.
К>Мда... К>Ясно что что-то есть (и даже в GHCi), но как это что-то "руками попробовать" что-то не догоняю. К>Не просветишь чайника?
Я не Саймон Пэйтон Дж. и даже не Саймон Марлоу
Я сомневаюсь, что в GHCi это делается. Можно под отладчиком попробовать посмотреть, сконструировав что-то, что по приведенной выше ссылке должно вычислиться строго Про то, как пользоваться отладчиком где-то в ru_lambda вроде недавно проскакивало или в документации GHC 6.8.x посмотри
Re[13]: Функция как первоклассная сущность для рантайма
Здравствуйте, deniok, Вы писали:
D>Я не Саймон Пэйтон Дж. и даже не Саймон Марлоу
D>Я сомневаюсь, что в GHCi это делается. Можно под отладчиком попробовать посмотреть, сконструировав что-то, что по приведенной выше ссылке должно вычислиться строго Про то, как пользоваться отладчиком где-то в ru_lambda вроде недавно проскакивало или в документации GHC 6.8.x посмотри
Ну нифигасе, чтоб пользоваться компилером надо дойти до уровня его создателей
Про гхци это я нетуда посмотрел видать, про дебагер видел упоминания (даж чуть заглянуть пока руки не доходили), но как-то не совсем врубаюсь при чём тут он...
Re[14]: Функция как первоклассная сущность для рантайма
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, deniok, Вы писали:
D>>Я не Саймон Пэйтон Дж. и даже не Саймон Марлоу
D>>Я сомневаюсь, что в GHCi это делается. Можно под отладчиком попробовать посмотреть, сконструировав что-то, что по приведенной выше ссылке должно вычислиться строго Про то, как пользоваться отладчиком где-то в ru_lambda вроде недавно проскакивало или в документации GHC 6.8.x посмотри
К>Ну нифигасе, чтоб пользоваться компилером надо дойти до уровня его создателей К>Про гхци это я нетуда посмотрел видать, про дебагер видел упоминания (даж чуть заглянуть пока руки не доходили), но как-то не совсем врубаюсь при чём тут он...
А что ты увидеть хочешь? Это — деталь реализации компилятора, полностью прозрачная для пользователя. По идее это может улучшить пространственную сложность некоторых алгоритмов, но, я думаю, только в отношении постоянного коэффициента
Re[15]: Функция как первоклассная сущность для рантайма
Здравствуйте, deniok, Вы писали:
D>А что ты увидеть хочешь? Это — деталь реализации компилятора, полностью прозрачная для пользователя. По идее это может улучшить пространственную сложность некоторых алгоритмов, но, я думаю, только в отношении постоянного коэффициента
Т.е. "снаружи" я это использовать не могу и если есть "затыки" в моём коде, то только лишь я во всём виноват?
Блин, а я-то надеялся, что можно хоть какие-нибудь примитивные ворнинги получить. Типа: "вот здесь всё строго-строго, а вот тут чот непонятное, вы уверены, что это не _|_?".