Size: a a a

2021 February 25

к

кана in Haskell
Максим Воротынский
Я просто написал компилятор и у меня AST сделано как DU и мне не комфортно от того, что если я хочу добавить новый вид ноды, то мне придется пересматривать весь код.
советую сделать все таки сумму, если например какой-нибудь юзер языка не может определить новую ноду в аст, и использовать какой-нибудь юниплейт, чтобы не матчить все везде
источник

к

кана in Haskell
O V
Ну типы известны на этапе компиляции. То есть явный тип у нас есть. Через какой нибудь аксессор, берём и делаем map
явный тип есть во время конструирования, а во время потребления списка типов уже нет, мы их стерли, не оставив никакой информации (свойств)
источник

OV

O V in Haskell
кана
явный тип есть во время конструирования, а во время потребления списка типов уже нет, мы их стерли, не оставив никакой информации (свойств)
Почему я сразу извинялась за этот вопрос? Потому что я не программист на Хаскелле, так, интересуюсь. И мне довольно забавно, что через монаду List на С++ довольно легко реализуются как раз такие гетерогенные списки-кортежи
источник

к

кана in Haskell
можно сделать что-то вроде

f :: [Dynamic] -> [String]
f = catMaybe \x ->
 case fromDynamic x of
   Just (x :: Int) -> Just (show x)
   Nothing -> case fromDynamic x of
     Just (x :: String) -> Just x
     _ -> Nothing

-- или
f :: [Dynamic] -> [String]
f = catMaybe \x -> asum
 [ show <$> fromDynamic @Int x
 , fromDynamic @String x
 ]

>>> f [toDyn (1 :: Int), toDyn "2", toDyn True]
["1", "2"]

что мало отличается от просто суммы (но отличается, можно класть любые типы, и можно доставать разные наборы типов при разных потреблениях, этакая сумма всех типов, но так легко упустить какие-то нужные типы, и компилятор никак не подскажет, только тесты)
источник

OV

O V in Haskell
кана
можно сделать что-то вроде

f :: [Dynamic] -> [String]
f = catMaybe \x ->
 case fromDynamic x of
   Just (x :: Int) -> Just (show x)
   Nothing -> case fromDynamic x of
     Just (x :: String) -> Just x
     _ -> Nothing

-- или
f :: [Dynamic] -> [String]
f = catMaybe \x -> asum
 [ show <$> fromDynamic @Int x
 , fromDynamic @String x
 ]

>>> f [toDyn (1 :: Int), toDyn "2", toDyn True]
["1", "2"]

что мало отличается от просто суммы (но отличается, можно класть любые типы, и можно доставать разные наборы типов при разных потреблениях, этакая сумма всех типов, но так легко упустить какие-то нужные типы, и компилятор никак не подскажет, только тесты)
Кажется, это примерно то, что и хотелось увидеть. Спасибо
источник

K

Kir in Haskell
кана
можно сделать что-то вроде

f :: [Dynamic] -> [String]
f = catMaybe \x ->
 case fromDynamic x of
   Just (x :: Int) -> Just (show x)
   Nothing -> case fromDynamic x of
     Just (x :: String) -> Just x
     _ -> Nothing

-- или
f :: [Dynamic] -> [String]
f = catMaybe \x -> asum
 [ show <$> fromDynamic @Int x
 , fromDynamic @String x
 ]

>>> f [toDyn (1 :: Int), toDyn "2", toDyn True]
["1", "2"]

что мало отличается от просто суммы (но отличается, можно класть любые типы, и можно доставать разные наборы типов при разных потреблениях, этакая сумма всех типов, но так легко упустить какие-то нужные типы, и компилятор никак не подскажет, только тесты)
Это выглядит как стрельба из картечницы по уткам (но именно так я планирую сделать в своём LR(1)-парсере typed интерфейс)
источник

ЖК

Жук Короед in Haskell
кана
пару лет назад хотел делать доклад по этой вроде бы очевидной теме, с названием типа "поменяйте радикализм на прагматизм", но потом охладел
А может стоит таки? 👀
источник

MK

Maxim Koltsov in Haskell
Короче, references в хлс действительно работают
источник

MK

Maxim Koltsov in Haskell
И это прекрасно
источник

DB

Danil Berestov in Haskell
Maxim Koltsov
Короче, references в хлс действительно работают
Но какой ценой?
источник

MK

Maxim Koltsov in Haskell
да никакой
источник

MK

Maxim Koltsov in Haskell
просто работают
источник

DB

Danil Berestov in Haskell
Не тормозит?
источник

MK

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

YS

Yan Shkurinskiy in Haskell
Maxim Koltsov
Короче, references в хлс действительно работают
Что за референсы?
источник

MK

Maxim Koltsov in Haskell
Yan Shkurinskiy
Что за референсы?
можно встать на какое-то имя и спросить, где в текущем проекте оно используется
источник

DB

Danil Berestov in Haskell
я так понимаю go to definition
источник

MK

Maxim Koltsov in Haskell
найдёт все места
источник

AP

Aleksei (astynax) Pi... in Haskell
Danil Berestov
Но какой ценой?
Ценой всего (количества памяти)
источник

IK

Ilya Kos in Haskell
Maxim Koltsov
Короче, references в хлс действительно работают
На любой GHC?
источник