>>309
モナド自体が珍しい訳じゃないのか。

>何を抽象化してモナドにしたの?
自然言語の、「普通のもの」とか「平均的なもの」という表現をHaskellでも使えないかな、と思った。
「普通のものを食べていれば大丈夫」という表現で、「普通のもの」の意味を決めるには
「食べる」という継続が必要、とか。

>具体例は何?
あまり役に立つものは作れそうにないけど、

withpc :: ((a -> r) -> P r a) -> P r a
withpc f = P $ \k -> unP (f k) k

runP :: P r r -> r
runP (P f) = f id

maxone, minone :: (Ord r) => [a] -> P r a
maxone es = withpc $ \f -> return $ maximumBy (\x y -> compare (f x) (f y)) es
minone es = withpc $ \f -> return $ maximumBy (\x y -> compare (f y) (f x)) es

test :: Int
test = runP $ do
  x <- maxone [1, 7, 9] -- 最終結果をなるべく大きくするように選ぶ
  y <- minone [2, 4, 9] -- こちらは小さくするように選ぶ
  return $ x^y `mod` 23

-- ふつうの継続モナドと違って、偽物の継続を渡すこともできる。
fork :: (a -> P r b) -> (a -> P r b) -> P r a -> P r b
fork real fake (P f) = P $ \k -> unP (real $ f (\v -> k $ unP (fake v) k)) k