>>758
数学詳しくないのでよく分からないけど、例えば次のような定義をした場合、

import Prelude hiding (return, fail, (>>=))
import qualified Prelude
import qualified Data.Set as S

class NewMonad m where {
(>>=) :: Ord b => m a -> (a -> m b) -> m b;
return :: a -> m a;
fail :: String -> m a }

instance NewMonad S.Set where {
m >>= k = S.unions $ map k $ S.toList m;
return = S.singleton;
fail _ = S.empty}

join :: (NewMonad m, Ord a) => m (m a) -> m a
join x = x >>= id

a, b, c :: S.Set Int
a = S.fromList [1,2,3,4,5]
b = S.fromList [2,4,6]
c = S.fromList [0,1,2,3]

d :: S.Set (S.Set Int)
d = S.fromList [a,b,c]

e :: S.Set Int
e = join d
-- つづく