Тип тривиальным заселена для любого Applicative
:
{-# LANGUAGE RankNTypes #-}
import Control.Applicative
import Control.Monad
import Data.Functor.Identity
import qualified Data.Traversable as T
f' :: (Applicative f) => f [f a] -> f [a]
f' = const $ pure []
, который явно не то, что вы хотели. Так давайте спросим для обитания
(Traversable t) => Behavior u (t (Behavior u a)) -> Behavior u (t a)
или в более общем плане, для которых аппликативных мы можем построить
(T.Traversable t) => f (t (f a)) -> f (t a)
Это заселена для любого f
, который также является монадой:
f :: (Monad m, T.Traversable t) => m (t (m a)) -> m (t a)
f = join . liftM T.sequence
Очевидным возникает вопрос: если аппликатив имеет такой f
, то он должен быть монадой? Ответ есть. Мы просто применить f
к Identity
проходимой (коллекции один-элемент - Traversable
экземпляр Identity
) и построить join
в
g :: (Applicative m) => (forall t . (T.Traversable t) => m (t (m a)) -> m (t a))
-> (m (m a) -> m a)
g f = fmap runIdentity . f . fmap Identity
Таким образом, наша функция заселена именно для тех аппликативных, которые также монады.
В заключение: Функция, которую вы ищете, будет существовать тогда и только тогда, когда Behavior
были Monad
. И поскольку это не так, скорее всего, такой функции нет. (Я считаю, что если бы существовал способ, как сделать это монада, было бы включить в библиотеку.)
Подпись типа действительна, можете ли вы объяснить, что конкретно представляет собой ваша проблема? Если я правильно понял, вы хотите сделать какую-то фильтрацию? – Adrian
Я не знаю реактивно-банановых, но есть еще вопрос о том, заселен ли этот тип. –
Спасибо, что упомянул, что «тип обитаемый», он приводит меня к вики-странице теоремы об изоморфизме Карри-Говарда на Haskell Wiki. – Adrian