← All posts tagged typefun

lpaste.net
Господа, есть ли разница между Elem и ElemC при работе с полиморфным кодом? Прозреваю, что констрейнт солвер поможет писать более полиморфный код с ElemC , но пример придумать не могу, где Elem завел бы его солвер в тупик. Есть идеи?

А как вообще пользоваться тайпемилями, выведенными синглтонами?
Вот такой код, например, вполне себе компилируется, хотя, по логике, не должен.

import Data.Promotion.Prelude.List

yoba :: ((Elem Int '[String, Double]) ~ 'False) => Int
yoba = 10

boba :: ((Elem Int '[String, Double]) ~ 'True) => Int
boba = 10

Судя по вот этой вот hackage.haskell.org документации, `boba` тайпчекатсья не должна же.

А в хаскеле еще не обсуждается нечто типа closed typeclasses? Чтобы вот такое вот

-- | Typeclass for sets and elements.
class (i ~ (Index e els)) => HGet els e i where
  -- | Gets any data from HSet for you
  hget :: HSet els -> e

instance HGet (e ': els) e 'Z where
  hget (HSCons e _) = e

instance (i ~ (Index e els), ('S i) ~ (Index e (e1 ': els)), HGet els e i) => HGet (e1 ': els) e ('S i) where
  hget (HSCons _ els) = hget els

Делать без третьего параметра. Тут не внапряг, а в других случаях бывает сильно сложнее, и бомбит еще больше. 
Ну короче, выбирать инстансы сверху вниз, как это в closed typefamilies делается. Вот это было бы очень круто, я считаю.

А в каком пакете у нас тайпфемили для type lists? Типа type family доказывающей, что элемент присутствует в списке, что один список — это подмножество другого, аля

type family ListElement a (b :: [*]) :: Bool
type family SubList (a :: []) (b :: []) :: Bool