Я! (на самом деле только в одном месте где нужно было выжать максимум из кода), но вот во всяких Data.List, ByteString, Binary оно встречается везде (ведь unboxed is unlifted).
Тогда толку от них? Что-то более-менее сложное без костылей не сделать (потому как система типов не даёт ни типов объединений, ни функций с бесконечным числом однотипных аргументов).
Думаю, тут хаскель в хорошей компании :) Хотя классы типов и шаблоны в 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);
которые тоже должны работать через конкретный тип.
но вот во всяких Data.List, ByteString, Binary оно встречается везде
Строгость, UNPACK и newtype (потому как оно само UNPACK) или MagicHash тоже (# типы, вроде Int#, из GHC.Prim)? Насколько я понимаю, всё что в * должно быть lifted, у unlifted другой kind — #.
Вот в типе и есть сумма типов когда она нужна (Maybe, Either, любой вариантный ADT).
В том и дело что в типе она всегда. То есть и тогда, когда не нужна. А она почти никогда не нужна.
и в хаскеле тоже lookup из разных контейнеров и окружения (POSIX, в смысле) возвращает Maybe.
Ага, общелисп - кривое говно
Это как-то глупо — разве что в очень далёком и абстрактном итоге, обычно семантика исключений требует дополнительного к базовой семантике (функции, возвращаемые значения) построения (как в TAPL, 14).
Нет, не требует. Исключения рассахариваются до Either.
Ээ, я хочу передать Nothing
Но случаеВ, когда вы хотите передать Nothing _не бывает_. Если у вас вылез Nothing - это ошибка, исключительная ситуация, тут надо выкидывать эррор, а не что-то куда-то передавать.
Что это?
Чего ты у меня спрашиваешь? Это же ты писал. Я только убрал Either/Maybe конструкторы.
Передавать и возвращать вариантные ADT не нужно, вообще ничего передавать и возвращать не нужно — всё можно протащить через исключения, hands down!1
Зачем же все протаскивать через исключения? через исключения надо протаскивать обработку ошибок, потому что система исключений спроектирована специально для этого, а все альтернативны варианты _значительно хуже_ (конкретные пункты, по которым хуже, я уже приводил и ты ничего по существу ответить на это не смог). И я не понимаю, почему надо из двух вариантов выбирать тот, что хуже.
И лучше, когда это формализуется и проверяется средствами ЯП, а не варварского языка мерзких трёхмерных людей.
Чем лучше? Это снизит затраты? Каким образом?
Ну вот он, разговор. Чистые функции оптимизируются и распараллеливаются очень легко.
Но это ложь. Грязная сишка на порядки быстрее чистого хаскеля.
Что не в 146%-то?
приведи пример задач, для которых не хватает производительности грязной сишки, и как эти задачи потом смогли решить на чистых ЯП да с такими-то оптимизациями.
а вот фиг без задачи поймешь, что он там хочет, может экзистенциальные, может хватит и typeable, может dynamic хочет, а может тегирование типов, может хватит врапа в ADT, может ему SumTypes на TypeOperators нужно, а может Typed protocol, когда тип разбираемого выражения или ответа основывается на полученном типе. Все нужно и полезно для своих задач..
Он хочет чтобы без всего этого говна. Просто есть список из элементов произвольного типа, с ним надо работать.
Я имел в виду только то, что сказал: что если есть гарантия чистоты, вычисления можно легко распараллелить или применить какие-нибудь сильные оптимизации, изменяющие порядок вычислений.
Можно услышать какие-то аргументы в пользу этой точки зрения? Ну то есть примеры такого распараллеливания и оптимизаций? А то пока что это остается не более чем фантазиями твоими.
слишком сложный вопрос, например читая хотя бы Окасаки увидеть, что ленивость необходима, для многих задач
В том-то и дело, что для всех этих задач не нужна ленивость семантики, нужна ленивость структур данных. Строгий язык с возможностью реализации ленивых структур все юзкейсы лени покрывает.
Оно там через хвостовую рекурсию «заносится», никакой имеративности.
Так, мне надоело.. расскажи мне real-world задачу, в которой нужно или удобнее использовать многопараметричность,
Это удобно во многих случаях. Например, одна ф-я map, где в хаскеле городится куча map'ов, зипперов и прочего говна. Семантика таких ф-й просто богаче.
Были кода возврата, потом выделили определенные паттерны работы с кодами возврата и запилили систему исключений. Вот Either- это те самые коды возврата.
Коды возврата - это, ведь, результаты выполнения функции?
ты расписался в том, что ты не понимаешь, что такое чистота. а почему повторного вычисления минуту длиной быть не может, читай статью, и вообще не заставляй меня игнорить анонима, т.к. у него бывают адекватные инкарнации.
я знаю почему я могу верить комментариям и аргументам Джона Тиббела и проч.отвечавшим, в его посте, и не понимаю, почему мя должен примимать тебя в серьез.
я похоже понял, что ты хочешь, и я там сделать не смогу (ну скорее не хочу время терять), но могуподкинуть идей и ссылок, как это можно сделать. Там ничего невыполнимого, но мне такое не надо было.
Не понял о каких ты аргументах говоришь. Я говорил о фактах - все юзкейсы лени покрываются ленивыми структурами данных. Абсолютно. Никто еще не придумал ни одного юзкейса, который бы не покрывался. Если Джон Тиббел считает, что придумал - линк, пожалуйста.
Видишь ли в чем дело - если один инструмент позволяет решить задачу сходу, без напряга, а для другого «не смогу», «не хочу тратить время», надо читать «идеи и ссылки», то это значит,что первый инструмент - хороший, годный, а второй - говно (по крайней мере в рамках этой задачи). И значит второй надо в данном случае выкинуть нахуй.
Видишь ли, _реальные_ проблемы обычно требуют для своего решения миллионов строк кода и десятков человеколет труда. поэтому несколько наивно было бы требовать от тебя решения _реальной_ проблемы.
хочешь разговаривать предметно go в jabber или зарегистрируйся, а так твое кукареканье не интересно.
ну или реши следующую задачу на лиспе, необходимо работать с $n$-мерными векторами фиксированной длины: нужно уметь скалярное, векторное произведение и сверку, хранить длину вектора нигде нельзя, данные хранить unboxed с прямым доступом в оперативке, необходимо гарантировать, что все созданные в вектора одикового размера, необходио уметь геренировать список базисных векторов, передавать параметром размер нельзя.
А перед написанием кода 3 дня поститься, потом исповедоваться, помыться в бане не надо? Или может ты ровно те-же условия к хаскелю или агде какой предъявишь?
Но что самое смешное - на CL (через FFI) решить твою задачу именно так, как ты написал, можно. Вот только, подозреваю, из-за постоянных переходов «туда-сюда» это окажется менее эффективно, чем тоже самое делать просто на родных векторах. Но тебе же надо обязательно «хранить длину вектора нигде нельзя, данные хранить unboxed с прямым доступом в оперативке» - а срать на ходу вприсядку тебе не надо?
Или может ты ровно те-же условия к хаскелю или агде какой предъявишь?
напишешь код - предъявлю.
Но что самое смешное - на CL (через FFI) решить твою задачу именно так, как ты написал, можно.
мне похрену, честно можешь хоть насрать на голову, просто меня заколебали идиоты лисперы, которые не могут отличать реально возникающие задачи от придуманных ими, или задач, которые по их мнению необходимы им для решения реальной задачи.
Вот ты как раз и сформулировал классическую xy-проблему. н-мерные вектора со статически проверяемой фиксированной длиной - это _решение_ задачи. И ты меня спрашиваешь, как реализовать это решение. А какова же была задача? Зачем ты решил писать эти статически проверяемые вектора?
Но вообще на динамике это решается весьма просто - объявляем n (длину векторов), операции/врапперы над этими векторами, котоыре используют n, не принимая аргументом, эспортируем врапперы, не экспортируем n. В результате мы можем работать только с векторами длины n.
Вот ты как раз и сформулировал классическую xy-проблему. н-мерные вектора со статически проверяемой фиксированной длиной - это _решение_ задачи. И ты меня спрашиваешь, как реализовать это решение. А какова же была задача? Зачем ты решил писать эти статически проверяемые вектора?
мне похрену честно, раз вам можно писать решение, а не задачу, значит и мне можно.
Но вообще на динамике это решается весьма просто - объявляем n (длину векторов), операции/врапперы над этими векторами, котоыре используют n, не принимая аргументом, эспортируем врапперы, не экспортируем n. В результате мы можем работать только с векторами длины n.
нет, мне нужно во внешнем коде уметь любое фиксированное n.
которые не могут отличать реально возникающие задачи
Так ты сам как выяснилось отличить не можешь. Вместо реальной задачи описал свои собственные хотелки. Результат решения реальной задачи - это полноценный программный продукт, который можно сразу брать и продавать за бабло (а если нельзя - то это не решение реальной задачи). Потому я и сказал, что требовать в рамках форума у кого-то решения реальной задачи - несусветная глупость. Потому просят решение абстрактных вещей - сделать вектора фиксированного размера, функции с произвольным чисом аргументов и т.п.
потому, что я так хочу, это ЗАДАЧА, если язык это не позволяет он ГОВНО ПО ОПРЕДЕЛЕНИЮ!!! мне надоели бестолковые анонимусы и теперь я играю по их правилам.
я то как раз могу, и специально привел X-Y проблему, т.к. анонимус - заколебал.
Результат решения реальной задачи - это полноценный программный продукт, который можно сразу брать и продавать за бабло (а если нельзя - то это не решение реальной задачи). Потому я и сказал, что требовать в рамках форума у кого-то решения реальной задачи - несусветная глупость.
я крайне надеюсь, что ты знаешь что такое декомпозиция, на форуме вполне можно требовать минимальный юнит требуемый в задаче, и если кому-то непонятно зачем он, объяснять следующий уровень, если декомпозиция проведена нормально, то идти дальше 1-2 уровней не протребуется, если оппонент не тролль.
нет, мне нужно во внешнем коде уметь любое фиксированное n.
Это нарушает условия. Либо у тебя все вектора имеют одну длину, либо n может меняться (если n поменял значит длина уже другая, значит условие нарушено). Выбирай одно из двух или формулируй точнее.
Это нарушает условия. Либо у тебя все вектора имеют одну длину, либо n может меняться (если n поменял значит длина уже другая, значит условие нарушено). Выбирай одно из двух или формулируй точнее.