#haskell #polymorphism #monads
#haskell #полиморфизм #монады
Вопрос:
У меня есть две монады, которые очень похожи (на самом деле они имеют одно и то же имя, но не полностью идентичны) и происходят от одного и того же типа класса. К сожалению, эти монады определены в разных библиотеках и не знают друг о друге. Когда я пытаюсь использовать MonadB в LibraryA в качестве контекста функции, я получаю сообщение об ошибке, что он ожидает MonadA, что вполне понятно. Есть ли какой-либо способ полиморфного использования MonadB в LibraryA без объединения двух библиотек вместе, возможно, используя вместо этого их общий тип класса в качестве контекста?
Комментарии:
1. монада — это набор функций.. я думаю, вы не можете просто заменять один код другим в двоичных файлах.. это открыло бы всевозможные странности и риски для безопасности.
2. Вы должны предоставить более подробную информацию — здесь трудно догадаться.
Ответ №1:
Вы можете использовать тип класса в качестве своего контекста, таким образом, вы будете ограничены общим подмножеством.
myFun :: forall m. MyClass m => m a
Вы также можете добавить туда дополнительные классы, хотя MyClass
обычно это требуется Monad
в любом случае.
Комментарии:
1. Правильно ли я понимаю, что «forall m.» в этом случае является избыточным?
2. @PaulJohnson, да, но некоторым людям нравится использовать это, чтобы подчеркнуть универсальность.