Size: a a a

PureScript — русскоговорящее сообщество

2019 May 15

λ

λоλторт in PureScript — русскоговорящее сообщество
да
источник

VY

Vasiliy Yorkin in PureScript — русскоговорящее сообщество
Vasiliy Yorkin
хм, забавно

data Foo a = Foo (Eq a => Show a => a)
бтв я никогда таким не пользовался в "реальной жизни", т.е. в коде, который я когда-либо писал констрейнты всегда было уместнее писать в типах ф-ций
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Я подумаю, может быть мне тоже окажется
источник

ЗП

Зигохистоморфный Препроморфизм in PureScript — русскоговорящее сообщество
делать смарт конструкторы
источник

ЗП

Зигохистоморфный Препроморфизм in PureScript — русскоговорящее сообщество
а не ерундой маяться
источник
2019 May 17

VY

Vasiliy Yorkin in PureScript — русскоговорящее сообщество
я думаю запилить какое-то приложение по типу https://github.com/thomashoneyman/purescript-halogen-realworld, на халоген, ну чтобы можно было в него подсматривать и мб делать какие-то вещи аналогично, в целях популяризации.
что-то более-менее простое, не требующее бэкенда, что-то работающее с готовым API, но сделанное чуть иначе, чем у Томаса и мб чуть более real world.
просто не уверен, что это занятие стоящее усилий. думаю, скорее нет, чем да
источник

ЗП

Зигохистоморфный Препроморфизм in PureScript — русскоговорящее сообщество
Ну ты уже это озвучил, дальше дело за малым
источник
2019 May 21

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Странный вопрос:

хотелось бы иметь тип данных, который служит обёрткой для String, но маркирует, на какую сущность указывает. например, для файловой структуры — это UUID, который может указывать и на файл и на каталог и на симлинк, но в некоторых случаях хотелось бы контролировать Compile-Time, что в функцию передали правильный UUID.

type UUID = String

data ClassifiedUUID
    = ToFile UUID
    | ToDirectory UUID
    | ToSymlink UUID

^ позволяет использовать ClassifiedUUID как ключ в Map, если сделать инстанс Ord, но не позволяет потребовать в функции только ToFile, например.

type UUID = String

newtype ToFile = ToFile UUID
newtype ToDirectory = ToDirectory UUID
newtype ToSymlink = ToSymlink UUID

^ позволяет требовать в функции конкретно ToFile, но не получится в ключе Map хранить информацию о том, на что ключ указывает (в значении по ключу тоже может содержаться эта информация, так что может это и не так важно).

Какой из способов вы бы использовали или вдруг есть какой-то, который объединяет и то и то?
источник

p

parket in PureScript — русскоговорящее сообщество
Anton Kotenko
Странный вопрос:

хотелось бы иметь тип данных, который служит обёрткой для String, но маркирует, на какую сущность указывает. например, для файловой структуры — это UUID, который может указывать и на файл и на каталог и на симлинк, но в некоторых случаях хотелось бы контролировать Compile-Time, что в функцию передали правильный UUID.

type UUID = String

data ClassifiedUUID
    = ToFile UUID
    | ToDirectory UUID
    | ToSymlink UUID

^ позволяет использовать ClassifiedUUID как ключ в Map, если сделать инстанс Ord, но не позволяет потребовать в функции только ToFile, например.

type UUID = String

newtype ToFile = ToFile UUID
newtype ToDirectory = ToDirectory UUID
newtype ToSymlink = ToSymlink UUID

^ позволяет требовать в функции конкретно ToFile, но не получится в ключе Map хранить информацию о том, на что ключ указывает (в значении по ключу тоже может содержаться эта информация, так что может это и не так важно).

Какой из способов вы бы использовали или вдруг есть какой-то, который объединяет и то и то?
Можно другими словами? Вот это "требовать в функции" сбивает с толку
источник

KV

Kirill Valyavin in PureScript — русскоговорящее сообщество
Anton Kotenko
Странный вопрос:

хотелось бы иметь тип данных, который служит обёрткой для String, но маркирует, на какую сущность указывает. например, для файловой структуры — это UUID, который может указывать и на файл и на каталог и на симлинк, но в некоторых случаях хотелось бы контролировать Compile-Time, что в функцию передали правильный UUID.

type UUID = String

data ClassifiedUUID
    = ToFile UUID
    | ToDirectory UUID
    | ToSymlink UUID

^ позволяет использовать ClassifiedUUID как ключ в Map, если сделать инстанс Ord, но не позволяет потребовать в функции только ToFile, например.

type UUID = String

newtype ToFile = ToFile UUID
newtype ToDirectory = ToDirectory UUID
newtype ToSymlink = ToSymlink UUID

^ позволяет требовать в функции конкретно ToFile, но не получится в ключе Map хранить информацию о том, на что ключ указывает (в значении по ключу тоже может содержаться эта информация, так что может это и не так важно).

Какой из способов вы бы использовали или вдруг есть какой-то, который объединяет и то и то?
Дико неудобно, но можно так:
http://code.slipthrough.net/2016/08/10/approximating-gadts-in-purescript/
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
parket
Можно другими словами? Вот это "требовать в функции" сбивает с толку
например, есть функция, которая делает что-то с файлом, но ей нужен и UUID каталога, и тогда у неё может быть либо сигнатура:

doSomethingWithFile :: UUID -> UUID -> ...
doSomethingWithFile dirUuid fileUuid = ...


либо:

doSomethingWithFile :: UUID.ToDirectory -> UUID.ToFile -> ...
doSomethingWithFile (UUID.ToDirectory dirUuid) (UUID.ToFile fileUuid) = ...


по сути ничего не меняется, но появляется дополнительный контроль в compile-time, для чего newtype и предназначен, как я понимаю
источник

p

parket in PureScript — русскоговорящее сообщество
Anton Kotenko
например, есть функция, которая делает что-то с файлом, но ей нужен и UUID каталога, и тогда у неё может быть либо сигнатура:

doSomethingWithFile :: UUID -> UUID -> ...
doSomethingWithFile dirUuid fileUuid = ...


либо:

doSomethingWithFile :: UUID.ToDirectory -> UUID.ToFile -> ...
doSomethingWithFile (UUID.ToDirectory dirUuid) (UUID.ToFile fileUuid) = ...


по сути ничего не меняется, но появляется дополнительный контроль в compile-time, для чего newtype и предназначен, как я понимаю
Так. Отлично. Что с Map?
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Наверное из-за -XGADTs и не пошёл спрашивать в чат про Хаскель, да :). Не знал, что в пурсе можно воспроизвести, спасибо.
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
parket
Так. Отлично. Что с Map?
В случае newtype нельзя сделать такой Map, в котором ключом мог бы быть и UUID.ToDirectory и UUID.ToFile и при этом в нем же хранилась бы информация, на что он указывает (как в случае с data).
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Понял, может просто остановлюсь на newtype, спасибо! Думал, вдруг упускаю какой-то способ без лишних извращений.
источник

p

parket in PureScript — русскоговорящее сообщество
instance Ord UUID

class HasUUID a where
   uuid :: a -> UUID

instance HasUUID ToFile
instance HasUUID ToDir

newtype Common = Common ( forall r .( forall a . HasUUID a => a -> r ) -> r )

runCommon ( Common f ) = f

liftCommon :: forall a . HasUUID a => a -> Common
liftCommon v = Common \ f -> f v  

instance HasUUID Common

instance HasUUID a => Ord a where
   ...


Так не получится?
источник

p

parket in PureScript — русскоговорящее сообщество
Ключ типа Common
источник

p

parket in PureScript — русскоговорящее сообщество
Ладно, сейчас сам проверю :)
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
Интересная мысль, думал через классы тоже как-то
источник

AK

Anton Kotenko in PureScript — русскоговорящее сообщество
кажется, Common это как раз версия newtype Leibniz a b = Leibniz (forall f. f a -> f b) из статьи.
источник