@haskellru

Страница 1527 из 1551
Alexander
17.10.2018
20:17:52
1.hs:26:6: error: • Found type wildcard ‘_’ standing for ‘S '["Yo!", "Q"]’ To use the inferred type, enable PartialTypeSignatures • In the type signature: t :: _ | 26 | t :: _

Maxim
17.10.2018
20:18:16
покажешь код?

Alexander
17.10.2018
20:18:30
data Some (s::[Symbol]) = Some data Foo (ws::[Symbol]) = Foo type family Union (xs::[l]) (ys::[l]) where Union '[] ys = ys Union (x:xs) ys = x ': Union xs ys data S (v :: [Symbol]) where S :: Some vs -> Foo ws -> S (Union vs ws) some1 :: Some '["Yo!"] some1 = Some foo1 :: Foo '["Q"] foo1 = Foo t :: _ t = some1 `S` foo1

смотри если неизвестны vs и ws то тип S не выведется

Google
Alexander
17.10.2018
20:18:56
а по типу S не выведется тип vs и ws

даже если известен тип одного из них

B. L.
17.10.2018
20:19:10
newtype это новый тип, для которого могут быть новые инстансы с тем же runtime преставлением что и вложенный
вопрос немного в сторону -- datatype в случае одного конструктора и одного поля не будут так же оптимизироваться?

Alexander
17.10.2018
20:19:11
т.к. нету инъективности

Maxim
17.10.2018
20:19:17
интересно почему у меня не работало. завтра на работе сравню с этим. спасибо

Alexander
17.10.2018
20:19:28
data ленивый, а newtype нет

Yuuri
17.10.2018
20:20:27
А если одно строгое? Оно не будет анбокситься?

(такое ощущение, что я когда-то уже задавал этот вопрос)

B. L.
17.10.2018
20:21:19
хорошо, допустим, я сделал его strict банг-паттерном

ой, опоздал

Alexander
17.10.2018
20:21:32
строгое неполиморфное анбокснутое - поидее так же

A64m
17.10.2018
20:24:22
нет

Google
A64m
17.10.2018
20:24:54
1) ньютайп не оптимизируется, у него нету рантайм представления в принципе

т.е. значение обернутое в ньютайп остается тем же, и можно к нему кастить

A64m
17.10.2018
20:26:09
конструктор со строгим анпакнутым полем будет иметь свой собственный инфотейбл

нуи можно пронаблюдать различия между ньютайпом и конструктором с одним строгим полем

B. L.
17.10.2018
20:27:15
инфотейблы которые как вот здесь описаны? https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/HeapObjects

Alexander
17.10.2018
20:27:46
да

A64m
17.10.2018
20:27:51
Consider the following declarations: newtype N = N Bool data D = D !Bool These examples illustrate the difference in pattern matching between types defined by data and newtype: (\ (N True) -> True) ⊥ ⇒ ⊥ (\ (D True) -> True) ⊥ ⇒ ⊥ (\ ˜(D True) -> True) ⊥ ⇒ True

и наоборт (\ (N _) -> True) ⊥ ⇒ True (\ (D _) -> True) ⊥ ⇒ ⊥

Yuuri
17.10.2018
20:33:02
О, спасибо

B. L.
17.10.2018
20:33:39
а что значит последний матчинг в первом сообщении? (спасибо)

˜(

вот это

Alexander
17.10.2018
20:34:22
irrefutable pattern

B. L.
17.10.2018
20:35:16
спасибо

Alexander
17.10.2018
20:35:19
Declarations are described in Chapter 4. Pattern bindings are matched lazily; an implicit ~ makes these patterns irrefutable. For example, let (x,y) = undefined in e does not cause an execution-time error until x or y is evaluated.

Matching an irrefutable pattern is non-strict: the pattern matches even if the value to be matched is ⊥. Matching a refutable pattern is strict: if the value to be matched is ⊥ the match diverges. The irrefutable patterns are as follows: a variable, a wildcard, N apat where N is a constructor defined by newtype and apat is irrefutable (see Section 4.2.3), var@apat where apat is irrefutable, or of the form ~apat (whether or not apat is irrefutable). All other patterns are refutable.

Haskell2010 language report

These examples demonstrate refutable vs. irrefutable matching: (\ ~(x,y) -> 0) ⊥ ⇒ 0 (\ (x,y) -> 0) ⊥ ⇒ ⊥ (\ ~[x] -> 0) [] ⇒ 0 (\ ~[x] -> x) [] ⇒ ⊥ (\ ~[x,~(a,b)] -> x) [(0,1),⊥] ⇒ (0,1) (\ ~[x, (a,b)] -> x) [(0,1),⊥] ⇒ ⊥ (\ (x:xs) -> x:x:xs) ⊥ ⇒ ⊥ (\ ~(x:xs) -> x:x:xs) ⊥ ⇒ ⊥:⊥:⊥

откуда и @A64m_qb0 примеры брал

Google
Misha
17.10.2018
21:07:22
gentlemen, а какую библиотеку взять для массивов/списков/векторов? - массивы будут небольшие - в пределах нескольких десятков элементов - нужна быстрая индексация - иногда нужен будет append и наоборот, отрезание последнего элемента - unboxed не надо, потому что лежать в нем будут TVar

Index
17.10.2018
21:08:06
http://hackage.haskell.org/package/primitive-0.6.4.0/docs/Data-Primitive-SmallArray.html

Для <10 элементов бери этот.

Misha
17.10.2018
21:08:59
о, круто, спасибо

Alexander
17.10.2018
21:14:19
append/отрезание правда будут копированем

Misha
17.10.2018
21:17:05
да, это понятно, но для небольшого размера это наверное даже лучше, локальность там, кэшлайны и все такое прочее

Alexander
17.10.2018
21:21:20
ну и шаринга не будет

как у массивов векторов, т.е. слайс не отдаш, но это норм

вообще SmallArray из primitive или SmallArray# напрямую - наверное лучшее решение

Misha
17.10.2018
21:36:46
как у массивов векторов, т.е. слайс не отдаш, но это норм
слайсы кажется не будут нужны, так что должно быть ок API у него выглядит громоздким конечно

Sergey
17.10.2018
22:53:45
Есть adt с несколькими конструкторами с различными параметрами. Как сделать Map с ключами - по одному на каждый вид конструктора (без параметров) ? Можно написать соответствующий adt - кальку "ключ конструктора", но кажется что возможен менее бойлерплейтный способ как-то протэгировать или пронумеровать эти конструкторы.

Alexander
17.10.2018
22:57:41
ну можно dataToTag позвать

можно наверное через generic это сделать

не знаю как dataToTag поведет себя на большом кол-ве конструкторов

Sergey
17.10.2018
23:08:55
их не много, просто хочется dry.

этот ? http://hackage.haskell.org/package/ghc-prim-0.5.3/docs/GHC-Prim.html#v:dataToTag-35-

а через generic это как ?

IC
18.10.2018
01:08:29
Ньютайп ещё ленивый по конструктору
Не ленивый, а идентичный содержимому.

Google
Aleksey
18.10.2018
04:20:16
Только лучше в newtype обернуть сначала и уже у этого newtype сделать хитрый инстанс Eq/Hashable/...

data T = I Int | B Bool | C Char deriving (Show) newtype K = K T deriving (Show) consName (I _) = 'I' consName (B _) = 'B' consName (C _) = 'C' instance Eq K where K x == K y = consName x == consName y instance Ord K where K x `compare` K y = consName x `compare` consName y generic для бедных

> insert (K (I 0)) "baz" $ insert (K (I 42)) "foo" empty fromList [(K (I 0),"baz")]

по одному ключу на конструктор

Terminator
18.10.2018
04:50:15
Xrickx будет жить. Поприветствуем!

A64m
18.10.2018
08:45:47
только кайнды в хаскеле убрали и звездочки задепрекейтили - пошли туториалы про кайнды со звездочками в коде

Dmitry
18.10.2018
08:46:22
Например?

Ilya
18.10.2018
08:46:40
ну так надо рассказать людям, чего их лишают

A64m
18.10.2018
08:46:52
https://diogocastro.com/blog/2018/10/17/haskells-kind-system-a-primer/

Dmitry
18.10.2018
08:47:11
17 okt

Ага

Можно ж issue оставить: https://github.com/dcastro/dcastro.github.io/issues/3

А то и PR

По замене *

https://diogocastro.com/blog/2018/10/17/haskells-kind-system-a-primer/
Статья, вроде, годная (для меня). Спасибо!

Terminator
18.10.2018
10:16:39
@EvgeniyIak будет жить. Поприветствуем!

Maxim
18.10.2018
12:04:33
@qnikst короче вот: λ> data Foo (vs :: [Symbol]) = Foo Int λ> data Bar (vs :: [Symbol]) where P :: Foo vs -> Bar vs λ> :t Foo @'["abc"] 5 Foo @'["abc"] 5 :: Foo '["abc"] λ> :t P (Foo @'["abc"] 5) P (Foo @'["abc"] 5) :: Bar '["abc"] λ> instance IsLabel name (Foo '[name]) where fromLabel = Foo 42 λ> :t P #foo P #foo :: IsLabel "foo" (Foo vs) => Bar vs почему с тайп апликейшеном проходит, а с лейблом нет?

я ожидаю увидеть в последней строке Bar '["foo"]

Alexander
18.10.2018
12:05:30
почему?

Maxim
18.10.2018
12:06:02
потому что инстанс IsLabel запихивает имя метки в тип, а конструктор P должен этот тип сохранять?

Google
Maxim
18.10.2018
12:06:09
есть возможность сделать то, что я хочу?

Alexander
18.10.2018
12:06:26
не вижу, почему он это запихивает

Maxim
18.10.2018
12:06:52
Instance IsLabel name (Foo '[name])

Alexander
18.10.2018
12:06:59
instance IsLabel name (Foo '["Haskell is awesome"]) where fromLabel = Foo 43

почему там Foo "foo" а не Foo "Haskell is awesome"

Maxim
18.10.2018
12:07:19
ну в смысле... этот name не прокидывается что ли?

Alexander
18.10.2018
12:07:33
в смысле могут быть другие инстансы 100500

у тебя нету функциональной зависимости

Maxim
18.10.2018
12:07:54
тааак... есть возможность сделать что я хочу?

Alexander
18.10.2018
12:08:03
type application используй

Maxim
18.10.2018
12:08:44
я хотел сделать красиво на лейблах ?‍♀️

Alexander
18.10.2018
12:09:26
в общем проблема в том, что может существовать много инстансов для IsLabel a b и нету никакого отношения между a и b

Maxim
18.10.2018
12:09:40
уныло

Alexander
18.10.2018
12:09:44
вообще наверное, что-то можно сделать

через pattern synonyms например

но я не умею

Страница 1527 из 1551