LINUX.ORG.RU

Ответ на: комментарий от qnikst

ага, ещё есть проблема с тем, что _|_ есть только у boxed values

Кстати, да, поэтому в сишечке _|_ особо весёлые, но как будто кто-то использует unlifted типы в повседневном хаскеле :)

quasimoto ★★★★
()
Последнее исправление: quasimoto (всего исправлений: 1)
Ответ на: комментарий от quasimoto

Я! (на самом деле только в одном месте где нужно было выжать максимум из кода), но вот во всяких Data.List, ByteString, Binary оно встречается везде (ведь unboxed is unlifted).

qnikst ★★★★★
()
Ответ на: комментарий от monk

Тогда толку от них? Что-то более-менее сложное без костылей не сделать (потому как система типов не даёт ни типов объединений, ни функций с бесконечным числом однотипных аргументов).

Думаю, тут хаскель в хорошей компании :) Хотя классы типов и шаблоны в C++ дают что-то вроде varargs-ов.

К слову, в нём нормально проверяется

А что тут должно проверяться?

test = (+ 1) <$> readLn

в простом виде ad-hoc полиморфная функция должна работать через какой-то явный (в compile time) тип, поэтому вместо

readLn >>= print

например, должно быть

(readLn :: IO Int) >>= print
readLn >>= (print :: Int -> IO ())
readIntLn >>= print where readIntLn :: IO Int; readIntLn = readLn
readLn >>= printInt where printInt :: Int -> IO (); printInt = print
readLn >>= \(via :: Int) -> print via
do { n :: Int <- readLn; print n }
...

Это как с

template <typename T> T read();
template <typename T> void print(T);

которые тоже должны работать через конкретный тип.

quasimoto ★★★★
()
Ответ на: комментарий от anonymous

Погоди, неужели, ты хочешь сказать, что в хаскеле нет возможности нелокального выхода при помощи исключения?

x4DA ★★★★★
()
Ответ на: комментарий от qnikst

но вот во всяких Data.List, ByteString, Binary оно встречается везде

Строгость, UNPACK и newtype (потому как оно само UNPACK) или MagicHash тоже (# типы, вроде Int#, из GHC.Prim)? Насколько я понимаю, всё что в * должно быть lifted, у unlifted другой kind — #.

quasimoto ★★★★
()
Ответ на: комментарий от qnikst

Собственно

catch :: forall (e :: *) (a :: *). Exception e => IO a -> (e -> IO a) -> IO a

есть *, про # ничего нет, соответственно

pureCatch :: forall (e :: *) (a :: *). Exception e => a -> (e -> a) -> a
quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Вот в типе и есть сумма типов когда она нужна (Maybe, Either, любой вариантный ADT).

В том и дело что в типе она всегда. То есть и тогда, когда не нужна. А она почти никогда не нужна.

и в хаскеле тоже lookup из разных контейнеров и окружения (POSIX, в смысле) возвращает Maybe.

Ага, общелисп - кривое говно

Это как-то глупо — разве что в очень далёком и абстрактном итоге, обычно семантика исключений требует дополнительного к базовой семантике (функции, возвращаемые значения) построения (как в TAPL, 14).

Нет, не требует. Исключения рассахариваются до Either.

Ээ, я хочу передать Nothing

Но случаеВ, когда вы хотите передать Nothing _не бывает_. Если у вас вылез Nothing - это ошибка, исключительная ситуация, тут надо выкидывать эррор, а не что-то куда-то передавать.

Что это?

Чего ты у меня спрашиваешь? Это же ты писал. Я только убрал Either/Maybe конструкторы.

Передавать и возвращать вариантные ADT не нужно, вообще ничего передавать и возвращать не нужно — всё можно протащить через исключения, hands down!1

Зачем же все протаскивать через исключения? через исключения надо протаскивать обработку ошибок, потому что система исключений спроектирована специально для этого, а все альтернативны варианты _значительно хуже_ (конкретные пункты, по которым хуже, я уже приводил и ты ничего по существу ответить на это не смог). И я не понимаю, почему надо из двух вариантов выбирать тот, что хуже.

anonymous
()
Ответ на: комментарий от dmfd

И лучше, когда это формализуется и проверяется средствами ЯП, а не варварского языка мерзких трёхмерных людей.

Чем лучше? Это снизит затраты? Каким образом?

Ну вот он, разговор. Чистые функции оптимизируются и распараллеливаются очень легко.

Но это ложь. Грязная сишка на порядки быстрее чистого хаскеля.

Что не в 146%-то?

приведи пример задач, для которых не хватает производительности грязной сишки, и как эти задачи потом смогли решить на чистых ЯП да с такими-то оптимизациями.

anonymous
()
Ответ на: комментарий от dmfd

Экзистенциальные типы.

Там не произвольный тип. Он боксится же.

Я составлю список и воспользуюсь функцией sum.

Все руками, все руками.

anonymous
()
Ответ на: комментарий от qnikst

а вот фиг без задачи поймешь, что он там хочет, может экзистенциальные, может хватит и typeable, может dynamic хочет, а может тегирование типов, может хватит врапа в ADT, может ему SumTypes на TypeOperators нужно, а может Typed protocol, когда тип разбираемого выражения или ответа основывается на полученном типе. Все нужно и полезно для своих задач..

Он хочет чтобы без всего этого говна. Просто есть список из элементов произвольного типа, с ним надо работать.

anonymous
()
Ответ на: комментарий от qnikst

без блокировок, но возможно приводящий к повторным вычислением

Да, ну и пусть будет повторно вычислено вычисление в минуту длинной. Или будет сделана пара другая тысяч лишних запросов к БД. Ничего страшного ведь!

anonymous
()
Ответ на: комментарий от anonymous

Я имел в виду только то, что сказал: что если есть гарантия чистоты, вычисления можно легко распараллелить или применить какие-нибудь сильные оптимизации, изменяющие порядок вычислений.

Можно услышать какие-то аргументы в пользу этой точки зрения? Ну то есть примеры такого распараллеливания и оптимизаций? А то пока что это остается не более чем фантазиями твоими.

anonymous
()
Ответ на: комментарий от qnikst

слишком сложный вопрос, например читая хотя бы Окасаки увидеть, что ленивость необходима, для многих задач

В том-то и дело, что для всех этих задач не нужна ленивость семантики, нужна ленивость структур данных. Строгий язык с возможностью реализации ленивых структур все юзкейсы лени покрывает.

anonymous
()
Ответ на: комментарий от qnikst

ненужно нам этих ваших императивных язычков :)

Оно там через хвостовую рекурсию «заносится», никакой имеративности.

Так, мне надоело.. расскажи мне real-world задачу, в которой нужно или удобнее использовать многопараметричность,

Это удобно во многих случаях. Например, одна ф-я map, где в хаскеле городится куча map'ов, зипперов и прочего говна. Семантика таких ф-й просто богаче.

anonymous
()
Ответ на: комментарий от anonymous

Он боксится же.

Есть иной путь?

Все руками, все руками.

Это ничем не отличается от лишпа, кроме отсутствия сахара.

anonymous
()
Ответ на: комментарий от anonymous

Были кода возврата, потом выделили определенные паттерны работы с кодами возврата и запилили систему исключений. Вот Either- это те самые коды возврата.

Коды возврата - это, ведь, результаты выполнения функции?

x4DA ★★★★★
()
Ответ на: комментарий от anonymous

Это ничем не отличается от лишпа, кроме отсутствия сахара.

А никакие тьюринг-полные языки в этом плане друг от друга ничем кроме сахара не отличаются. По-этому давайте писать на брейнфаке.

Есть иной путь?

Ну как в нормальных (динамических то есть) языках.

anonymous
()
Ответ на: комментарий от anonymous

в SBCL емнип, возможны native integer-ы, правда, тегированые.

x4DA ★★★★★
()
Ответ на: комментарий от anonymous

Но это ложь. Грязная сишка на порядки быстрее чистого хаскеля.

А на ассемблере экспоненциальный алгоритм выполняется за линейное время, и что?

приведи пример задач, для которых не хватает производительности грязной сишки

Я могу привести пример задачи, где нежелательна трата времени на колупание с сишкой и поиск гонок, полученных от распараллеливания грязного кода.

Чем лучше?

Я уже написал.

anonymous
()
Ответ на: комментарий от anonymous

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

qnikst ★★★★★
()
Ответ на: комментарий от anonymous

я знаю почему я могу верить комментариям и аргументам Джона Тиббела и проч.отвечавшим, в его посте, и не понимаю, почему мя должен примимать тебя в серьез.

qnikst ★★★★★
()
Ответ на: комментарий от monk

я похоже понял, что ты хочешь, и я там сделать не смогу (ну скорее не хочу время терять), но могуподкинуть идей и ссылок, как это можно сделать. Там ничего невыполнимого, но мне такое не надо было.

qnikst ★★★★★
()
Ответ на: комментарий от anonymous

Подозреваю, что в них вообще всё boxed.

Не знаю, это детали реализации. Может что-то боксируется там, может нет, в семантике языка нет ничего про боксинг, в этом суть.

anonymous
()
Ответ на: комментарий от anonymous

Я могу привести пример задачи, где нежелательна трата времени на колупание с сишкой и поиск гонок, полученных от распараллеливания грязного кода.

И оно будет работать быстрее вручную распаралеленной сишки? Я хотет таких задач.

Я уже написал.

Где? Можно увидеть ссылку?

anonymous
()
Ответ на: комментарий от qnikst

ы расписался в том, что ты не понимаешь, что такое чистота.

я прекрасно знаю, что такое чистота.

а почему повторного вычисления минуту длиной быть не может, читай статью

Сам внимательно прочитай, тогда поймешь, почему _может_.

anonymous
()
Ответ на: комментарий от qnikst

Не понял о каких ты аргументах говоришь. Я говорил о фактах - все юзкейсы лени покрываются ленивыми структурами данных. Абсолютно. Никто еще не придумал ни одного юзкейса, который бы не покрывался. Если Джон Тиббел считает, что придумал - линк, пожалуйста.

anonymous
()
Ответ на: комментарий от qnikst

Видишь ли в чем дело - если один инструмент позволяет решить задачу сходу, без напряга, а для другого «не смогу», «не хочу тратить время», надо читать «идеи и ссылки», то это значит,что первый инструмент - хороший, годный, а второй - говно (по крайней мере в рамках этой задачи). И значит второй надо в данном случае выкинуть нахуй.

anonymous
()
Ответ на: комментарий от qnikst

Видишь ли, _реальные_ проблемы обычно требуют для своего решения миллионов строк кода и десятков человеколет труда. поэтому несколько наивно было бы требовать от тебя решения _реальной_ проблемы.

anonymous
()
Ответ на: комментарий от qnikst

Вот скажем так - какую проблему решает статическая типизация?

anonymous
()
Ответ на: комментарий от anonymous

хочешь разговаривать предметно go в jabber или зарегистрируйся, а так твое кукареканье не интересно.

ну или реши следующую задачу на лиспе, необходимо работать с $n$-мерными векторами фиксированной длины: нужно уметь скалярное, векторное произведение и сверку, хранить длину вектора нигде нельзя, данные хранить unboxed с прямым доступом в оперативке, необходимо гарантировать, что все созданные в вектора одикового размера, необходио уметь геренировать список базисных векторов, передавать параметром размер нельзя.

qnikst ★★★★★
()
Последнее исправление: qnikst (всего исправлений: 1)
Ответ на: комментарий от qnikst

ну или реши следующую задачу на лиспе...

А перед написанием кода 3 дня поститься, потом исповедоваться, помыться в бане не надо? Или может ты ровно те-же условия к хаскелю или агде какой предъявишь?

Но что самое смешное - на CL (через FFI) решить твою задачу именно так, как ты написал, можно. Вот только, подозреваю, из-за постоянных переходов «туда-сюда» это окажется менее эффективно, чем тоже самое делать просто на родных векторах. Но тебе же надо обязательно «хранить длину вектора нигде нельзя, данные хранить unboxed с прямым доступом в оперативке» - а срать на ходу вприсядку тебе не надо?

yyk ★★★★★
()
Ответ на: комментарий от anonymous

А на ассемблере экспоненциальный алгоритм выполняется за линейное время, и что?

чего?!

Waterlaz ★★★★★
()
Ответ на: комментарий от yyk

Или может ты ровно те-же условия к хаскелю или агде какой предъявишь?

напишешь код - предъявлю.

Но что самое смешное - на CL (через FFI) решить твою задачу именно так, как ты написал, можно.

мне похрену, честно можешь хоть насрать на голову, просто меня заколебали идиоты лисперы, которые не могут отличать реально возникающие задачи от придуманных ими, или задач, которые по их мнению необходимы им для решения реальной задачи.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

Вот ты как раз и сформулировал классическую xy-проблему. н-мерные вектора со статически проверяемой фиксированной длиной - это _решение_ задачи. И ты меня спрашиваешь, как реализовать это решение. А какова же была задача? Зачем ты решил писать эти статически проверяемые вектора?

Но вообще на динамике это решается весьма просто - объявляем n (длину векторов), операции/врапперы над этими векторами, котоыре используют n, не принимая аргументом, эспортируем врапперы, не экспортируем n. В результате мы можем работать только с векторами длины n.

anonymous
()
Ответ на: комментарий от anonymous

Вот ты как раз и сформулировал классическую xy-проблему. н-мерные вектора со статически проверяемой фиксированной длиной - это _решение_ задачи. И ты меня спрашиваешь, как реализовать это решение. А какова же была задача? Зачем ты решил писать эти статически проверяемые вектора?

мне похрену честно, раз вам можно писать решение, а не задачу, значит и мне можно.

Но вообще на динамике это решается весьма просто - объявляем n (длину векторов), операции/врапперы над этими векторами, котоыре используют n, не принимая аргументом, эспортируем врапперы, не экспортируем n. В результате мы можем работать только с векторами длины n.

нет, мне нужно во внешнем коде уметь любое фиксированное n.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

которые не могут отличать реально возникающие задачи

Так ты сам как выяснилось отличить не можешь. Вместо реальной задачи описал свои собственные хотелки. Результат решения реальной задачи - это полноценный программный продукт, который можно сразу брать и продавать за бабло (а если нельзя - то это не решение реальной задачи). Потому я и сказал, что требовать в рамках форума у кого-то решения реальной задачи - несусветная глупость. Потому просят решение абстрактных вещей - сделать вектора фиксированного размера, функции с произвольным чисом аргументов и т.п.

anonymous
()
Ответ на: комментарий от alienclaster

потому, что я так хочу, это ЗАДАЧА, если язык это не позволяет он ГОВНО ПО ОПРЕДЕЛЕНИЮ!!! мне надоели бестолковые анонимусы и теперь я играю по их правилам.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

потому, что я так хочу, это ЗАДАЧА

Ну ради бога, я тебе описал решение.

anonymous
()
Ответ на: комментарий от anonymous

Так ты сам как выяснилось отличить не можешь.

я то как раз могу, и специально привел X-Y проблему, т.к. анонимус - заколебал.

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

я крайне надеюсь, что ты знаешь что такое декомпозиция, на форуме вполне можно требовать минимальный юнит требуемый в задаче, и если кому-то непонятно зачем он, объяснять следующий уровень, если декомпозиция проведена нормально, то идти дальше 1-2 уровней не протребуется, если оппонент не тролль.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

нет, мне нужно во внешнем коде уметь любое фиксированное n.

Это нарушает условия. Либо у тебя все вектора имеют одну длину, либо n может меняться (если n поменял значит длина уже другая, значит условие нарушено). Выбирай одно из двух или формулируй точнее.

anonymous
()
Ответ на: комментарий от anonymous

Это нарушает условия. Либо у тебя все вектора имеют одну длину, либо n может меняться (если n поменял значит длина уже другая, значит условие нарушено). Выбирай одно из двух или формулируй точнее.

в юзерском коде N может быть любое фиксированное.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

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

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

и если кому-то непонятно зачем он

Он нужен для повышения уровня абстракции и модуляризации. Конкретный пример я привел - один единственный map вместо зоопарка ф-й.

anonymous
()
Ответ на: комментарий от anonymous

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

ну я попросил дать след уровень

Он нужен для повышения уровня абстракции и модуляризации. Конкретный пример я привел - один единственный map вместо зоопарка ф-й.

не принимается, давай уровень выше.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

в юзерском коде N может быть любое фиксированное.

Ну ладно, пусть тогда будет макрос (set-n! n), который можно вызвать только один раз и в топлевеле.

anonymous
()
Ответ на: комментарий от qnikst

не принимается, давай уровень выше.

А выше уже совершенно любая задача, в которой может использоваться ф-я map. Я заебусь перечислять.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.