Здравствуйте, WolfHound, Вы писали:
WH>Есть ли языки где можно провернуть такой фокус проверив типы unwrap в месте ее описания, а не в месте вызова.
То, чем ты занимаешься, называется "извращение". Присоединюсь, если ты не против
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, IncoherentInstances, TypeFamilies #-}
data Box a = Box a
class Boxed b v where
unwrap :: b -> v
instance Boxed b v => Boxed (Box b) v where
unwrap (Box x) = unwrap x
instance (l ~ r) => Boxed l r where
unwrap x = x
> unwrap (Box(Box(Box(Box(123)))))
123