• code Haskell хочется_странного typefun
    есть
    
    data HList :: [*] -> * where
      HNil :: HList '[]
      :>    :: t -> HList ts -> HList (t ': ts)
    
    хочу написать тип:
    
    data C t a b = forall s . <magic-here> => C !s (a -> s -> (b,s))
    
    где <magic-here> должно обозначать следующее, каждый элемент в (HList s) должен быть элементом класса VectorSpace.
    
    Напр запись <magic-here> VectorSpace t (HList s), будет говорить, что весь HList является VectorSpace, что в свою очередь будет обозначать что каждый элемент списка тоже VectorSpace..
    
    В принципе есть хак, который мне не очень нравится, сделать
    
    data HList :: * -> [*] -> * where
      HNil :: HList a '[]
      (:>) :: VectorSpace a t => t -> HList ts -> HList a (t':ts)
    
    это классно сработает, но данное решение обозначает, что я не могу использовать HList из других либ и придётся таскать свой.

Replies (4)

  • @qnikst, так это
    instance VectorSpace t => VectorSpace t (HList (t ': '[])) ....
    instance (VectorSpace (HList ts), VectorSpace t) => VectorSpace (HList (t ': ts))
    не?
  • @sopvop, Напр запись <magic-here> VectorSpace t (HList s), будет говорить, что весь HList является VectorSpace, что в свою очередь будет обозначать что каждый элемент списка тоже VectorSpace..
    тут ты делаешь HList инстансом VectorSpace, а это неверно (ну в крайнем случае не то, что хочется)
  • @qnikst, Вы таки будете смеяться, но их у нас есть hackage.haskell.org класс ArityC
  • @PineappleZombie, опа круто