関数型プログラミング言語Haskell Part7
■ このスレッドは過去ログ倉庫に格納されています
0310デフォルトの名無しさん
2007/05/13(日) 09:27:00モナド自体が珍しい訳じゃないのか。
>何を抽象化してモナドにしたの?
自然言語の、「普通のもの」とか「平均的なもの」という表現を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
■ このスレッドは過去ログ倉庫に格納されています