Cheese
речь-то про дерайвинг для произвольного произведения
Ilya
ну можно обойтись кортежами и {-# LANGUAGE GeneralizedNewtypeDeriving #-}
Ilya
хотя я за дерайвинг для произведения, да
Ilya
и на чём порешили?
большинство высказались за отделение в пакет
Ilya
(который уже и так был до этого обсуждения)
Cheese
для кортежа это логично
Мерль
Полнофункциональные гетерогенные списки https://ruhaskell.org/posts/dynamic/2017/09/01/Fully-functional-heterogeneous-lists.html
Alexander
type HList c = [C c] data C (c :: Constraint) = forall c a . C a ?
Alexander
статью не читал
Ilya
там пожестче:)
Misha
там как-то все очень непонятно, что и зачем
Alexander
но этого же достаточно для того чтобы выразить что угодно
Alexander
разве что можно добавить Typeable к c
Зигохистоморфный
разве что можно добавить Typeable к c
Примеры чего угодно?) Список из мейби изер и пар?) Можно сделать?
Alexander
я про то, что все что хочется от гетерогенного списка
Cheese
не всё
Cheese
можно обращаться к элементам по единому интерфейсу
Alexander
можно
Alexander
или я не понял фразы
Cheese
а получать данные в оригинальных типах уже нет
Cheese
для этого я на прошлой неделе изобретал свои велосипеды
Alexander
Typeable есть - можешь
Cheese
а, ну да, с Typeable можно кастовать обратно
Alexander
когда пишешь такие штуки логично Typeable требовать всегда
Alexander
тогда можно всегда заткнуть дыру, которую упустил в дизайне =)
Cheese
ждём разоблачающей статьи «а вот как это делается на самом деле в 5 строк»
Alexander
человек все нормально сделал
Alexander
у него тоже решение только в профиль
Alexander
+- интерфейс под удобные ему задачи
Alexander
data Wrap (constraint :: * -> Constraint) where Wrp :: (Show a, Typeable a, constraint a) => a -> Wrap constraint instance Show (Wrap a) where show (Wrp a) = show a
Alexander
это тоже самое что data Wrap c = forall a . (Show a, Typeable a, c a) => W a
Alexander
т.е. +- детали
Ilya
instance Read f => Read (Food f) where readsPrec i s = [runState (sequence $ pure $ state $ head . readsPrec i) s]
Ilya
это нормальный код или нет?
Ilya
чтобы читать тип Food, который объявлен как data Food f = Food {energy :: f, protein :: f, fat :: f, carbs :: f, price :: f}
Ilya
читать как список аргументов
Ilya
что-то меня гложат сомнения:)
Ilya
работает так λ> (read "1 2 3 4 5")::(Food Int) 1 2 3 4 5
Ilya
(show тоже выводит без конструктора)
Ilya
я с Read очень мало работал, не знаю, как там принято делать
Ilya
первая версия этого кода выглядел так readsPrec i s = let [(nrg, s1)] = readsPrec i s [(prt, s2)] = readsPrec i s1 [(fat, s3)] = readsPrec i s2 [(crb, s4)] = readsPrec i s3 [(prc, s5)] = readsPrec i s4 in [(Food nrg prt fat crb prc, s5)]
Ilya
но потом я там увидел монаду State и понеслась
Ilya
оба кода эквивалентны, если что
Cheese
никогда не видел, чтобы Read для чего-то полезного использовался
Ilya
Через что ещё?
Cheese
на парсеке это будет что-то вроде sepBy space number
Зигохистоморфный
Ну и many?
Cheese
простите, я навскидку не помню парсек
Alexander
Read желательно писать так чтобы Read.Show работало
Vasiliy
в base есть парсер-комбинаторы, если что
Vasiliy
на них инстанс Read делается куда приятнее
Alexander
причин писать свой Read не как deriving Read я наверное даже не знаю
Vasiliy
Text.ParserCombinators.ReadP
Ilya
Read желательно писать так чтобы Read.Show работало
У меня работает, если я правильно понял фразу
Ilya
Форматы одинаковы
Ilya
работает так λ> (read "1 2 3 4 5")::(Food Int) 1 2 3 4 5
Alexander
вообще Read/Show это чисто технические вещи
Alexander
для показа пользователю в файлы стоит всякие PrettyPrint и т.п.
Alexander
но это моё странное мнение
Anonymous
+5 к мнению. Parsec/Text.PrettyPrint
Aleksei (astynax)
Есть мнение, что Show и Read вообще должны быть только автовыводимыми
Aleksei (astynax)
Вон, Universum (это такая прелюдия) только такие и позволяет
Anonymous
Есть мнение, что readP неудобен в использовании
Aleksei (astynax)
https://github.com/serokell/universum#gotchas > Since show doesn't come from Show anymore, you can't write Show instances easily. Either use autoderived instances or Buildable.
Arseniy
:)
Aleksei (astynax)
Автора позабавило упоминание?
Aleksei (astynax)
:)
Anonymous
В чём основная философия функционального программирования?
sleeping
чморить объектно-ориентированных
Vasiliy
programming, motherfucker
Anonymous
Cheese
философия в том, что с функциями всё работает без фмлософии
Cheese
а базовые принципы ФП — это, конечно, functions are FCO и HOF
a66ath
Второе какбэ из первого выводится
Anonymous
Просто у нас тут небольшая дискуссия. Говорю, что ООП против ФП прежде всего это разница с манипуляцией данными. Изменяемость против неизменяемости.
Anonymous
Речь именно о парадигмах.