Size: a a a

2021 June 07

B

Bodigrim in Haskell
чего?
источник

¯

¯\_(ツ)_/¯ in Haskell
например, файлов (или я не так отвечаю на этот вопрос?)
источник

¯

¯\_(ツ)_/¯ in Haskell
бинарный формат
источник

B

Bodigrim in Haskell
ну, data Int128 = Int128 Word64 Word64 - это хорошее представление, занимает всего три машинных слова: конструктор + два ворда. если, скажем, использовать ByteArray#, то понадобится как минимум четыре: хедер, длина массива + два ворда, а надо же еще и забоксить.
источник

B

Bodigrim in Haskell
можно, конечно, прямо unboxed tuple фигануть (# Word64#, Word64# #), но работать будет очень неудобно. если где-то понадобится забоксить - то считай шило на мыло.
источник
2021 June 08

АХ

Алексей Худяков... in Haskell
Только надо банги поставить, а то ворд64 забоксит
источник

АХ

Алексей Худяков... in Haskell
Да и компилятор не дурак он может и избавляться от конструктора в промежуточных вычислениях и там выйдет как раз та пара
источник

AS

Anton Sorokin in Haskell
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleInstances #-}
module Smth where

class Eq a => X a

class Eq c => Y c

instance X a => Y a

Где то написано, почему такое не тайпчекается, то есть что надо instance (Eq a, X a) => Y a писать? Как то нелогично что ограничения на класс X игнорируются
источник

AS

Anton Sorokin in Haskell
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleInstances #-}
module Smth where

class Eq a => X a
 where x :: a
class Eq c => Y c
 where y :: c

instance (Eq a, X a) => Y a where
 y = x

f :: X a => a
f = y

Причем не в инстансе X a вполне достаточно, то есть такое работает
источник

к

кана in Haskell
вопрос хороший, я попытался объяснить через "представь классы как рекорды", но получилось наоборот

data Eq a = Eq { a -> a -> Bool }
data X a = X { eq :: Eq a, x :: a }
data Y a = Y { eq :: Eq a, y :: a }

yFromX :: X a -> Y a
yFromX X { eq, x } = Y { eq, y = x }

и тут Eq аргумент тоже не нужен
источник

к

кана in Haskell
но если посмотреть на Core, то там в инстанс кладется именно Eq из аргумента, а не из X, то есть ghc просто даже не пытается смотреть на подклассы

instance (Eq a, X a) => Y a where
 y = x

в

$y :: forall a. (Eq a, X a) => Y a
$y = \(@a) ($eq :: Eq a) ($x :: X a) ->
 Y @a $eq (x @a $x)
источник

MK

Maxim Koltsov in Haskell
так это, рекорд инстанса Eq a => X a не хранит в себе рекорд Eq a
источник

к

кана in Haskell
хранит
источник

к

кана in Haskell
хранит именно рекорд класса X a
источник

MK

Maxim Koltsov in Haskell
покажи
источник

к

кана in Haskell
да вон выше кусок кора, который создает Y инстанс
источник

к

кана in Haskell
там кладется $eq первым аргументом конструктора
источник

к

кана in Haskell
$p1X :: forall a. X a => Eq a
$p1X = \(@a) ($x :: X a) ->
 case $x of $x { X _1 _2 -> _1 }

x :: forall a. X a => a
x = \(@a) ($x :: X a) ->
 case $x of $x { X _1 _2 -> _2 }

мало того, даже селектор Eq генерируется
источник

к

кана in Haskell
все зависимости классов (не инстансов) кладутся в рекорды классов, так сабтайпинг классов и работает
источник

MK

Maxim Koltsov in Haskell
хм, мне казалось что этот сабтайпинг требует чтобы инстанс приезжал от пользователя
источник