
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

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) ньютайп не оптимизируется, у него нету рантайм представления в принципе
т.е. значение обернутое в ньютайп остается тем же, и можно к нему кастить

Ilya
17.10.2018
20:26:05

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

Index
17.10.2018
21:01:50

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

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

Aleksey
18.10.2018
04:18:56

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
По замене *

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 например
но я не умею