Проблема в том, что Haskell не знает, какому экземпляру Cabbage
соответствует foo
. Насколько я знаю, это не соответствует a
в (undefined :: a)
с a
в quux :: Cabbage a => String -> a
Предполагая, что это то, что вы хотите, вы можете сделать это:
quux :: Cabbage a => String -> a
quux s = result
where result = bar (s ++ foo result)
Это связывает foo и bar вместе, так что он использует один и тот же экземпляр для обоих, и, так как вам на самом деле не нужно значение ввода для foo, оно заканчивается. Хотя я не знаю лучшего способа создания констант для каждого экземпляра. Надеюсь, придет кто-то еще, кто это сделает.