• ? Haskell typefun у меня проблема я хочу написать класс типов:

    class CanInsert x y where
    insert :: x -> y -> InsertResult x y

    type family InsertResult x y :: *
    type instance InsertResult x (CustomSetG '[]) = CustomSetG (x ': '[])
    type instance InsertResult x (CustomSetG (y ': ys)) = If (x == y) (CustomSetG (x ': ys)) (CustomSetG (y ': InsertResult x ys))

    тут проблема в ветке false т.к. InsertResult x ys :: * то оно не вставляется в ': и не promot-ится т.к. нет конструктора

    если я уберу CustomSetG то вопрос, как вернуть результат с kind [*]:


    type family InsertResult x y :: [*]
    type instance InsertResult x (CustomSetG '[]) = (x ': '[])
    type instance InsertResult x (CustomSetG (y ': ys)) = If (x == y) ( (x ': ys)) ((y ': InsertResult x ys))

    ?

Replies (4)

  • @qnikst, А чего оно должно делать и какие у x,y кайнды?
  • @PineappleZombie, Лучше всю зпдачу объясню, чтобы xy проблемы не было: у меня есть CustomSet :: [] -> .
    Я хочу сделать операцию insert :: a -> CustomSet bs -> CustomSet magichere, где magichere — работает так что возвращает bs если a включено и a':bs если а не включено. Я решил это делать тайпклассом CanInsert a b c, где, но или у меня перекрываются инстансы или конфликты(если a->c, b->c), в итоге я решил делать чурез type family, оттуда 2 варианта выше.
  • @qnikst, Ага, должно сработать. У меня там ещё одна проблема была но похоже я знаю как её обойти. Проблема т.к. мне нужен инстансы для x (x':xs) и x == y ~ => False x (y ': ys) т.к. head конфликтуют то пробблема