Вы можете упростить эту задачу для себя, используя только один тип данных и параметризовав его по типу данных, которые вы хотите хранить на каждом узле:
data HTree a = Leaf a Char | Branch a (HTree a) (HTree a)
Тогда ваше взвешенное деревоHTree Integer
, а ваше невзвешенное дерево - HTree ()
, что означает, что вы не хотите хранить дополнительные данные в дереве.Таким образом, Haskell может ясно видеть, что ваши два типа тесно связаны - с кодом, который вы разместили в вопросе, они представляются двумя совершенно не связанными типами.Если вы дополнительно включите одно безобидное языковое расширение, вы можете использовать эту близкую связь, чтобы вообще не писать конверсию!
{-# LANGUAGE DeriveFunctor #-}
import Data.Functor ((<$))
data HTree a = Leaf a Char
| Branch a (HTree a) (HTree a)
deriving Functor
stripLabels :: HTree a -> HTree ()
stripLabels = (() <$)
Обратите внимание, что теперь stripLabels
настолько просто, что вам даже не нужночтобы определить его: вы можете просто вставить его на сайтах использования.