LINUX.ORG.RU

В GHC добавлена поддержка WebAssembly

 , ,


0

2

Привет, ЛОР!

Релиза пока нет, поэтому на новость не тянет, и я оставлю это здесь.

https://www.tweag.io/blog/2022-11-22-wasm-backend-merged-in-ghc/

В GHC теперь есть поддержка WebAssembly и можно будет совать хачкелл прямо в сайты. Раньше тоже можно было с помощью GHCJS, но он убог и отсосен. Теперь будет менее убого, наверное.

Ответ на: комментарий от Laz

Без FFI ничего интересней факториала не напишешь. А если и напишешь, то вывести результат юзеру не сможешь.

Конечно. Но бэкенд гораздо сложнее запилить, чем FFI, так что основная часть уже сделана.

Плюс, я вроде где-то читал, что у GHC будут более частые релизы, а не раз в год как раньше. Поэтому 9.8 считай тоже не за горами.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Плюс, я вроде где-то читал, что у GHC будут более частые релизы, а не раз в год как раньше. Поэтому 9.8 считай тоже не за горами.

Сомневаюсь, что более частые релизы означают, что на FFI будет потрачено меньше времени. Скорее, это означает, что FFI будет в 9.10 или каком-нибудь 10.X.

Laz ★★★★★
()
Ответ на: комментарий от Laz

Не, у них раньше вроде была проблема, что многие фичи не включались в релизы, потому что релиз кат уже прошёл, а сам релиз через несколько месяцев ещё. Более быстрый цикл разработки тут как раз может помочь.

Один хрен, это всё будет довольно скоро уже.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от Laz

Ну он много чо обещал :)

Тут проблема в том, что как бы очередной C++ не получился, только ленивый и с тайпклассами. ИМХО ради зав.типов лучше сразу Агду взять, благо она умеет FFI с хачкеллем.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от fluorite

В плане приложений? Знаю что во внутренних сервисах сейчас нередко blazor используется. Даже звали пилить CRMку.

Но тут есть некоторые нюансы и проблемы, особенно касаемо производительности при интеропе с жс, но в целом для внутренних морд штука балдежная. Но жирная.

ritsufag ★★★★★
()
Ответ на: комментарий от monk

Достаточно для чего? Это всё таки сильно разные вещи.

Кстати, для свежих версий GHC жидкохачкеля нет :(

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Достаточно для чего? Это всё таки сильно разные вещи.

Для зависимых типов и их проверки.

Кстати, для свежих версий GHC жидкохачкеля нет :(

Вот это реально грустно.

monk ★★★★★
()
Ответ на: комментарий от monk

Для зависимых типов и их проверки.

Эмм… Жидкохаскелл не реализует зависимые типы. Refinement types – это всё таки немного другая тема. В данном случае, к каждому типу приделывается предикат, которому значения этого типа должны удовлетворять.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

В данном случае, к каждому типу приделывается предикат, которому значения этого типа должны удовлетворять.

Предикат результата может зависеть от предиката и типа аргументов, а это уже зависимые типы.

monk ★★★★★
()
Ответ на: комментарий от monk

Эммм… нет. Зависимые типы зависят от значений. Иначе в хачкелле уже давно есть зависимые типы:

type family F a where
  F Int = Bool
  F Bool = Int
  F x = ()

Видишь? Тип F зависит от другого типа!

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Зависимые типы зависят от значений.

Так в Liquid так и есть:

{-@ length :: xs:[a] -> {v: Int | v = (len xs)} @-}
length :: [a] -> Int
length []     = 0
length (x:xs) = 1 + length xs

{-@ map      :: (a -> b) -> xs:[a] -> {v:[b] | (len v) = (len xs)} @-}
map _ []     = []
map f (x:xs) = (f x) : (map f xs)
monk ★★★★★
()
Ответ на: комментарий от monk

Ага. Но эта штука крайне ограничена. А теперь попробуй использовать в refinement type, например, какую-нибудь монадическую функцию.

К слову, эти два механизма не то чтобы противопоставлены и не исключают друг друга. Т.е. тебе никто не мешает их интегрировать, хотя бы в теории. Например, как тут: https://www.tweag.io/blog/2021-02-05-refinement-types/

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Ага. Но эта штука крайне ограничена. А теперь попробуй использовать в refinement type, например, какую-нибудь монадическую функцию.

А внутри комментариев LH разве её не получиться описать?

monk ★★★★★
()
Ответ на: комментарий от monk

Не, не получится. LH ограничен примитивными типами. Там особо не развернёшься. Я даже не уверен, что оно классы и type families умеет.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от monk

Ну а теперь попробуй вычислить с помощью этого предиката что-то и вынести это обратно в код в виде значения.

Говорю же, это совершенно разные вещи.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Ну а теперь попробуй вычислить с помощью этого предиката что-то и вынести это обратно в код в виде значения.

Так у класса типов значения не бывает. У любого значения в Haskell только один тип.

monk ★★★★★
()
Ответ на: комментарий от AndreyKl

так вроде в хаскеле можно функции над типами объявлять, или мне память изменяет?

Можно, но там лямбд нет. Надо отдельное имя для каждой задавать.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от monk

Так у класса типов значения не бывает.

Да, потому что это constraint. Но я не об этом. Я о том, чтобы вынести значение из типов образно в значения, как например knownNat это делает с числами.

У любого значения в Haskell только один тип.

В Haskell – да. Но если мы добавляем Refinement Types, то это уже далеко не так, и каждое значение может пренадлежать какому угодно количеству этих refined types.

Ну и да, я всё ещё утверждаю, что dependent types и refinement types – разные вещи, у которых только области применения слегка пересекаются.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Ну и да, я всё ещё утверждаю, что dependent types и refinement types – разные вещи, у которых только области применения слегка пересекаются.

пару лет назад обсуждали эту тему с monk и кажется в доках по refinement types прямо написано что это некоторое подмножество зависимых типов. Надо бы проверить, правда, поскольку за давностью лет могу путать.

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

Вот есть точное определение: https://cs.stackexchange.com/questions/21728/dependent-types-vs-refinement-types/126730#126730

Thus, refinement types are similar to dependent pair types whose second type are restricted to being a decidable predicate.

В общем, жидкие типы являются подмножеством зависимых.

monk ★★★★★
()