
Yuriy
01.09.2017
13:26:13

Ilya
01.09.2017
13:28:10
(который уже и так был до этого обсуждения)

Yuriy
01.09.2017
13:28:38
для кортежа это логично

Google

Мерлин
01.09.2017
14:18:25
Полнофункциональные гетерогенные списки
https://ruhaskell.org/posts/dynamic/2017/09/01/Fully-functional-heterogeneous-lists.html

Alexander
01.09.2017
14:26:54
type HList c = [C c]
data C (c :: Constraint) = forall c a . C a
?
статью не читал

Ilya
01.09.2017
14:31:28
там пожестче:)

Misha
01.09.2017
14:35:52
там как-то все очень непонятно, что и зачем

Alexander
01.09.2017
14:47:34
но этого же достаточно для того чтобы выразить что угодно
разве что можно добавить Typeable к c

Denis
01.09.2017
14:52:37

Alexander
01.09.2017
14:53:00
я про то, что все что хочется от гетерогенного списка

Yuriy
01.09.2017
14:59:48
не всё
можно обращаться к элементам по единому интерфейсу

Alexander
01.09.2017
15:00:31
можно
или я не понял фразы

Google

Yuriy
01.09.2017
15:01:14
а получать данные в оригинальных типах уже нет
для этого я на прошлой неделе изобретал свои велосипеды

Alexander
01.09.2017
15:02:01
Typeable есть - можешь

Yuriy
01.09.2017
15:02:53
а, ну да, с Typeable можно кастовать обратно

Alexander
01.09.2017
15:03:13
когда пишешь такие штуки логично Typeable требовать всегда
тогда можно всегда заткнуть дыру, которую упустил в дизайне =)

Yuriy
01.09.2017
15:03:47
ждём разоблачающей статьи «а вот как это делается на самом деле в 5 строк»

Alexander
01.09.2017
15:04:52
человек все нормально сделал
у него тоже решение только в профиль
+- интерфейс под удобные ему задачи
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
это тоже самое что data Wrap c = forall a . (Show a, Typeable a, c a) => W a
т.е. +- детали

Ilya
01.09.2017
15:13:35
instance Read f => Read (Food f) where
readsPrec i s = [runState (sequence $ pure $ state $ head . readsPrec i) s]
это нормальный код или нет?
чтобы читать тип Food, который объявлен как
data Food f = Food {energy :: f,
protein :: f,
fat :: f,
carbs :: f,
price :: f}
читать как список аргументов
что-то меня гложат сомнения:)
работает так
λ> (read "1 2 3 4 5")::(Food Int)
1 2 3 4 5
(show тоже выводит без конструктора)

Google

Ilya
01.09.2017
15:16:16
я с Read очень мало работал, не знаю, как там принято делать
первая версия этого кода выглядел так
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)]
но потом я там увидел монаду State и понеслась
оба кода эквивалентны, если что

Yuriy
01.09.2017
15:21:05
никогда не видел, чтобы Read для чего-то полезного использовался

Ilya
01.09.2017
15:22:06
Через что ещё?

Yuriy
01.09.2017
15:22:18
на парсеке это будет что-то вроде sepBy space number

Denis
01.09.2017
15:22:38
Ну и many?

Yuriy
01.09.2017
15:23:19
простите, я навскидку не помню парсек

Alexander
01.09.2017
15:23:24
Read желательно писать так чтобы Read.Show работало

Vasiliy
01.09.2017
15:23:32
в base есть парсер-комбинаторы, если что
на них инстанс Read делается куда приятнее

Alexander
01.09.2017
15:23:59
причин писать свой Read не как deriving Read я наверное даже не знаю

Denis
01.09.2017
15:24:25

Vasiliy
01.09.2017
15:26:24
Text.ParserCombinators.ReadP

Ilya
01.09.2017
15:26:25
Форматы одинаковы
работает так
λ> (read "1 2 3 4 5")::(Food Int)
1 2 3 4 5

Google

Alexander
01.09.2017
15:34:38
вообще Read/Show это чисто технические вещи
для показа пользователю в файлы стоит всякие PrettyPrint и т.п.
но это моё странное мнение

kir
01.09.2017
15:42:53
+5 к мнению. Parsec/Text.PrettyPrint

Aleksey
01.09.2017
16:15:20
Есть мнение, что Show и Read вообще должны быть только автовыводимыми
Вон, Universum (это такая прелюдия) только такие и позволяет

kir
01.09.2017
16:22:01
Есть мнение, что readP неудобен в использовании

Aleksey
01.09.2017
16:35:54
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
01.09.2017
16:36:26
:)

Aleksey
01.09.2017
16:36:55
Автора позабавило упоминание?
:)

Masson
01.09.2017
16:40:02
В чём основная философия функционального программирования?

Sleeping
01.09.2017
16:40:36
чморить объектно-ориентированных

Vasiliy
01.09.2017
16:41:12
programming, motherfucker

Yuriy
01.09.2017
16:45:55
философия в том, что с функциями всё работает без фмлософии
а базовые принципы ФП — это, конечно, functions are FCO и HOF

Abbath
01.09.2017
16:49:07
Второе какбэ из первого выводится

Masson
01.09.2017
16:57:56
Просто у нас тут небольшая дискуссия. Говорю, что ООП против ФП прежде всего это разница с манипуляцией данными. Изменяемость против неизменяемости.
Речь именно о парадигмах.

Alexander
01.09.2017
17:00:54
нет конечно

Google

Alexander
01.09.2017
17:01:02
и как может быть ФП против ООП
это вообще ортогональные вещи

Валерий
01.09.2017
17:01:26
Задачи решают функции, а не объекты

Sleeping
01.09.2017
17:01:59
OOP was good back in the days, and it still has its uses today, but now everyone is realising modifying states is equivalent to kicking babies, so now everyone is moving to immutable objects and functional programming

Даниил
01.09.2017
17:02:03
вот как раз в другой чят писал
я бы фп определил как парадигму, ориентированную на создание чистых (не эксплуатирующих сайд-эффекты) абстракций, на которых хорошо работает композиция, как-то так наверное
тому що всё фп оно о какой-нибудь композиции
функций, трансдьюсеров, монад, функторов и т.д.

Alexander
01.09.2017
17:04:57
альтернатива для ФП это императивное программирование
их можно сравнивать
ООП это о представлении данных и связанных с ними функциях

Даниил
01.09.2017
17:05:31
тогда уж правильнее будет декларативное vs императивное, не?

Alexander
01.09.2017
17:05:37
ООП сочетается как с ФП, так и с иммутабельностью

Sleeping
01.09.2017
17:05:42

Alexander
01.09.2017
17:06:03
@KolesnichenkoDS согласен

Валерий
01.09.2017
17:06:14
См. скала?))0)

Даниил
01.09.2017
17:06:15

Sleeping
01.09.2017
17:07:18
вы же знаете про featherweight java?
эта милота у Пирса в книжке есть
начинается с лямбда-инсчисления

Даниил
01.09.2017
17:07:47

Alexander
01.09.2017
17:08:00
классическое mainstream определение это про то, что система работы с данными где данные образуют иерархию со свойствами инкампуляция, наследование, subtype полиморфизм ?

Sleeping
01.09.2017
17:08:02
и на каком-то моменте реализуется маленькая джава