λ
data Foo a = Foo (Eq a => Show a => a)
Size: a a a
VY
data Foo a = Foo (Eq a => Show a => a)
AK
ЗП
ЗП
VY
ЗП
AK
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
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
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 хранить информацию о том, на что ключ указывает (в значении по ключу тоже может содержаться эта информация, так что может это и не так важно).AK
doSomethingWithFile :: UUID -> UUID -> ...
doSomethingWithFile dirUuid fileUuid = ...
doSomethingWithFile :: UUID.ToDirectory -> UUID.ToFile -> ...
doSomethingWithFile (UUID.ToDirectory dirUuid) (UUID.ToFile fileUuid) = ...
newtype и предназначен, как я понимаюp
doSomethingWithFile :: UUID -> UUID -> ...
doSomethingWithFile dirUuid fileUuid = ...
doSomethingWithFile :: UUID.ToDirectory -> UUID.ToFile -> ...
doSomethingWithFile (UUID.ToDirectory dirUuid) (UUID.ToFile fileUuid) = ...
newtype и предназначен, как я понимаюAK
-XGADTs и не пошёл спрашивать в чат про Хаскель, да :). Не знал, что в пурсе можно воспроизвести, спасибо.AK
newtype нельзя сделать такой Map, в котором ключом мог бы быть и UUID.ToDirectory и UUID.ToFile и при этом в нем же хранилась бы информация, на что он указывает (как в случае с data).AK
newtype, спасибо! Думал, вдруг упускаю какой-то способ без лишних извращений.p
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
p
AK
AK
Common это как раз версия newtype Leibniz a b = Leibniz (forall f. f a -> f b) из статьи.