Возможно ли построить функцию, которая будет отображать кортеж монадов произвольной arity?Haskell: как отобразить функцию над произвольным набором монад
например,
f :: (m a -> m [a]) -> (m x, m y) -> (m [x], m [y])
(но для произвольной арности). This similar question, имеет ряд перспективных предложений; например, линзы 'each
или over both
, но каждый из них, по-видимому, требует кортежа гомогенных типов: я хочу использовать кортеж гомогенных монадов с различными внутренними типами.
Хорошо, спасибо @AJFarmer. Я боялся, что это невозможно сделать, но не может явно объяснить причину; поэтому подумал, что стоит спросить, если только уточнить, почему нет. Кажется, ключ состоит в том, что fn, переданный как первый arg, привязан к одному конкретному a в момент создания экземпляра, если мы не будем использовать rankNTypes, как вы говорите. – user3416536
@ user3416536 это правильно; переменные типа переносятся по типу функции, и неясно, что два типа с разными переменными равны, но это возможно. 'forall' просто говорит, что он может работать на любом типе, который, конечно же, включает' m x' и 'm y'! – AJFarmar