Size: a a a

2021 March 03

к

кана in Haskell
впечатлен тому, как ты умудрился написать простой инстанс так сложно)
источник

[

[BRM]White Rabbit in Haskell
это не я писал
источник

к

кана in Haskell
а, ну если это статья такая, то понятно
источник

[

[BRM]White Rabbit in Haskell
кана
впечатлен тому, как ты умудрился написать простой инстанс так сложно)
у меня ещё будет чем тебя удивить. Ты рад?
источник

ЗП

Зигохистоморфный Пре... in Haskell
😂
источник

[

[BRM]White Rabbit in Haskell
там кстати тип парсера объявлен через newtype, это что за магичество такое? А, ну и автор_ка в начале для вкатывания в хаскель советовала сырую недописанную книжку "О Haskell по-человечески", читал я эту книжку, галопом по Европам 140 страниц, дальше пустота и "ожидайте новых глав", после неё у меня хаскель из головы через 3 дня вылетел.
источник

к

кана in Haskell
инстанс-то на самом деле однострочный
источник

ЗП

Зигохистоморфный Пре... in Haskell
[BRM]White Rabbit
там кстати тип парсера объявлен через newtype, это что за магичество такое? А, ну и автор_ка в начале для вкатывания в хаскель советовала сырую недописанную книжку "О Haskell по-человечески", читал я эту книжку, галопом по Европам 140 страниц, дальше пустота и "ожидайте новых глав", после неё у меня хаскель из головы через 3 дня вылетел.
это что за статья такая?
источник

к

кана in Haskell
[BRM]White Rabbit
там кстати тип парсера объявлен через newtype, это что за магичество такое? А, ну и автор_ка в начале для вкатывания в хаскель советовала сырую недописанную книжку "О Haskell по-человечески", читал я эту книжку, галопом по Европам 140 страниц, дальше пустота и "ожидайте новых глав", после неё у меня хаскель из головы через 3 дня вылетел.
newtype это как type-алиас для типов, только создает новый номинальный тип

то есть если есть

newtype X = X Int

то X и Int структурно одинаковые (в рантайме например), но тайпчекер их различает

это позволяет без оверхеда различать Int который обозначет деньги от Int который обозначет секунды, например

и так же иметь разные инстансы для них
источник

[

[BRM]White Rabbit in Haskell
Да хотел почитать по парсерам на хаскеле, вбил в гугл и пошёл по первой попавшейся
https://habr.com/ru/post/436234/
источник

к

кана in Haskell
кана
newtype это как type-алиас для типов, только создает новый номинальный тип

то есть если есть

newtype X = X Int

то X и Int структурно одинаковые (в рантайме например), но тайпчекер их различает

это позволяет без оверхеда различать Int который обозначет деньги от Int который обозначет секунды, например

и так же иметь разные инстансы для них
например, для Int нельзя выбрать однозначный инстанс моноида, это может быть как моноид по сумме, так и по произведению, так и еще по какой-нибудь ассоциативной операции с нейтральным элементом

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

к

кана in Haskell
кроме того для ньютайпов есть один важный инструмент: coerce

если два типа X и Y это просто номинально разные версии одного и того же типа (например X - ньютайп над Y, или они оба ньютайпы от другого типа Z, который тоже может быть ньютайпом), то можно, и конструкторы X и Y есть в контексте, то существует функция coercе, которая сменит номинальный тип

newtype X = X Int

a :: Int
a = 1

b :: X
b = coece a

c :: [Int]
c = [1, 2, 3]

d :: [X]
d = coerce x

plus :: Int -> Int -> Int
plus a b = a + b

plus_xxx :: X -> X -> X
plus_xxx = coerce plus

plus_xix :: X -> Int -> X
plus_xix = coerce plus_xxx -- = coerce plus

писать d = map coerce x нет смысла, так как это по сути будет map id
источник

R

Roman in Haskell
кана
f input = do
 guard (... isPrefix )
 pure (drop, ...)
источник

к

кана in Haskell
рассказал все сам, чтобы человек случайно не прочитал что-нибудь про newtype = data с одним конструктором
источник

O

Ortofax in Haskell
ещё у newtype нет дополнительного levity, т.е.
data A = A () имеет значения undefined, A undefined и A ()
newtype A = A () имеет значения A undefined и A ()
источник

[

[BRM]White Rabbit in Haskell
это ты хорошо придумал, хотя мне хватило и "алиас на тип, но который компилятор различает с исходным"
источник

O

Ortofax in Haskell
что соответствует утверждению о том, что рантайм представления типов одинаковые
источник

к

кана in Haskell
[BRM]White Rabbit
это ты хорошо придумал, хотя мне хватило и "алиас на тип, но который компилятор различает с исходным"
в такой формулировке нет ничего про инстансы, а это по сути основное, для чего используют ньютайпы
источник

к

кана in Haskell
для просто алиаса type Parser a = String -> [(a, String)] нельзя определить функтор парсера, потому что он уже определен для (String ->)
источник

к

кана in Haskell
хм, имхо в статье описывается монадический парсер, а не аппликативный, хоть инстанс монады и не определяется

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