Haskell — Есть ли способ взаимозаменяемо использовать две монады, производные от одного и того же класса?

#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, да, но некоторым людям нравится использовать это, чтобы подчеркнуть универсальность.