Alexander
оверлоадед лист заменяет [a,b,c] на fronList [a,b,c]
Alexander
а там типы не сойдутся
кана
Для учебных целей попробовал реализовать интерпретатор лямбда-исчисления. Мой первый подход тупой - я имел некий контекст (массив пар имя*терм), шел по АСТу, заменял (Var name) на значение из контекста. Это не сработало, потому что для каждой лямбды нужно еще запоминать контекст ее создания. Можно было как-то преобразовывать в другое дерево, где у лямбд уже есть контекст, я не стал. Поэтому я стал гуглить у нашел некий доклад, где просто тупо взяли формализацию ЛИ и имплементировали (то есть никаких контекстов, просто когда находим (\x.e) v, то деалем замену x->v в e. Это решение работает, но не выглядит эффективным. Вопрос такой: какой из подходов лучше? UPD: энвайромент какой-нибудь таки нужен для тайп/клос-чекинга
кана
код второго подхода https://gist.github.com/kana-sama/e044a6cd4666daf27f5076bf4377f132
Vasiliy
без прагм и атрибутов (а-ля pure)?
да, достаточно включить оптимизации
Vasiliy
в простых случаях генерируемый из рекурсивной функции код будет точно таким же, как и генерируемый из циклов
Vasiliy
с чем-то сложным я не экспериментировал, но вообще, он может оптимизировать любые хвостовые вызовы
Vasiliy
я переписал некоторое время назад один код с лютой лапши на CPS с лямбдами, изменения в производительности были в пределах погрешности
Leonid 🦇
@qnikst а нет network-transport-tls?
Alexander
турки писали по вебсокетам транспорт
Denis
https://twitter.com/broadway_lamb/status/919286296262082560
Ilya
https://twitter.com/broadway_lamb/status/919286296262082560
я бы плюсы в правый край засунул на картинке из xkcd
Denis
Плюсы явно правее должны быть
Anonymous
objc
Danila Matveev
скалу забыли
https://s14-eu5.ixquick.com/cgi-bin/serveimage?url=https:%2F%2Fpbs.twimg.com%2Fmedia%2FCAQimeDVEAAlnSh.jpg&sp=44553a8d03d2faae2f938ac490366729
Cheese
http://devzen.ru/wp-content/uploads/2017/03/dz135.jpg
IC
Lambda cat is watching you calculate
Кабачок
++
За скалу надо не плюсовать, а <|*|>
Denis
что это за инфиксный goatse?
Denis
E[*]Ǝ
Кабачок
Спейсшип оператор, известен тем, что если не знать его названия, в гугле про него ничего не найдешь
Denis
это вид сзади?
Кабачок
Все вопросы к мейнтейнерам scalaz
Denis
напоминает котика http://photo.iarex.ru/insimgs/201336/b551410b92e4.jpg авторства путина
Ilya
E[*]Ǝ
E(_*_)Ǝ
Ilya
извините
Dmitrii
это невозможно все же
@qnikst @hotkosc Это всё же возможно. Вот гист: https://gist.github.com/ChShersh/a13d97b5659382e94107ea8bc8e30c46 А вот вопрос с SO, о котором я говорил: https://stackoverflow.com/questions/43435721/how-to-combine-two-lists-in-haskell
Alexander
@chshersh а ну если ещё и num то можно
Alexander
но это только для цифирей
Alexander
а со строками или т.п. уже не взлетит
A64m
кто-нибудь вообще видел какие-то примеры использования этих нетипизированных списков, чтоб они хорошее впечатление производили?
Dmitry
чего это они нетипизированные?
A64m
я понимаю, что они на самом деле монотипизированные
A64m
и вопрос в основном сводится к "кто-нибудь видел какие-то примеры на языках с одним типом, которые производили бы зорошее впечатление?"
Кабачок
Что есть хорошее впечатление?
Dmitry
IRL пришлось использовать экзистенциальные типы и даже RankNTypes в задаче, пожалуй, динамического полиморфизма - вывод API с общей сигнатурой. но разным поведением из сервантовских типов. еще пачка расширений, что бы типы выводились
Dmitry
насчет хорошего впечатления не уверен, но по другому было никак
A64m
@greenest_pig когда не хочется этого больше никогда не видеть
A64m
@voidlizard я про примеры таких списков из дин.языков от их любителей
Dmitry
ну тут был не список, но задача похожая на ту, которую приводят в примерах для этих списков - т.е тип толком неизвестен, но для него есть реализация определенных тайпклассов, поэтому можно вызывать их методы
Dmitry
конкретно списка не использовалось, при этом.
Кабачок
То есть как это обычно делается в ООЯ.
Dmitry
ага.
Dmitry
в хаскелле это боль.
A64m
это боль тогда, когда в операциях параметров этого неизвестного типа больше одного
A64m
когда один - еще сносно
A64m
но все равно надо бойлерплейт писать обычно
A64m
правда, проблема одного параметра и в ООП обычно есть, исключая всякую экзотику
A64m
@cblp_su в смысле, когда они как структурированный файл используются а ля жсон?
Cheese
да, как формат
A64m
а в этом то случае какие преимущества у безтиповых языков? Там даже линзы не сделать вроде тех что для иксемеля и жсона в хаскеле есть? Даже элементарных удобств нет
Dmitry
1) порог входа 2) простота реализации
Кабачок
Секспы парсить просто.
A64m
что в языке с типами их парсить сложнее что-ли?
Anonymous
вектор с трейт объектами использовал в расте пару раз
Зигохистоморфный
вопросик
A64m
смотрю Park Bench Panel Session with #HaskellX Experts пурскриптофанат меня затроллил
A64m
ну конечно, еще и антитуплофолдабелист закукареал.
Dmitry
ситуацией с иде, что ли?
A64m
нет
Зигохистоморфный
вопрос отпал
Зигохистоморфный
но возник другой
Anonymous
да
A64m
деперь про гипотетических БЕГИННЕРОВ еще
A64m
кажется, что хуже быть не может уже, но уже в следующую минуту ясно, что хуже всегда может быть
Зигохистоморфный
есть такой код data MyFreeF f a r = MyReturnF a | MyBindF (f r) deriving (Functor, Foldable, Traversable) type MyFree f a = Fix(MyFreeF f a) pattern MyReturn a = Fix (MyReturnF a) pattern MyBind a = Fix (MyBindF a) cataFix alg = alg . fmap (cataFix alg) . unfix cataFixM f = (>>= f) . cataFix (traverse (>>= f)) liftF' c = MyBind (fmap MyReturn c) retract' = cataFixM alg where alg (MyReturnF a) = return a alg (MyBindF as) = as e = do x <- liftF' [10, 20] y <- liftF' [30, 40] return $ x * y retract' e но я чот не догоню чего patterns не работают • Couldn't match kind ‘* -> *’ with ‘*’ When matching the kind of ‘Fix’ • In a stmt of a 'do' block: x <- liftF' [10, 20] In the expression: do { x <- liftF' [10, 20]; y <- liftF' [30, 40]; return $ x * y } In an equation for ‘e’: e = do { x <- liftF' [10, ....]; y <- liftF' [30, ....]; return $ x * y } если взять просто retract' $ liftF' [10] работает не спрашивайте зачем) просто есть эксперимент что нам нужен только Fix
A64m
но вообще нынешний haskellx неплохой
Зигохистоморфный
попробовал сделать аппликатив, но instance Functor f => Applicative (MyFree f) where pure = MyReturn MyReturn a <*> MyReturn b = MyReturn $ a b MyReturn a <*> MyBind mb = MyBind $ fmap a <$> mb MyBind ma <*> b = MyBind $ (<*> b) <$> ma как это решить? • The type synonym ‘MyFree’ should have 2 arguments, but has been given 1 • In the instance declaration for ‘Applicative (MyFree f)’
A64m
а если сигнатуры для паттернов написать?
Зигохистоморфный
не помогло
Зигохистоморфный
pattern MyReturn :: a -> MyFree f a pattern MyReturn a = Fix (MyReturnF a) pattern MyBind :: f (MyFree f a) -> MyFree f a pattern MyBind a = Fix (MyBindF a)
A64m
я не ожидал, что это заработает, я ожидал что сообшение об ошибках другое будет
Зигохистоморфный
эм
Зигохистоморфный
что-то не так с паттернами