私はMonad、ReaderT、...を台無しにして、「単純な?」を実行しています。行動。
Maybe
テスト関数を変換 (Maybe
または別のパーソナライズされたモナド)に散在させたいと考えています。
まさに、私t
は呼び出しを避けて、ある種のモナド(モナドだと思う)を作成したい
doCalculus :: (Int -> Bool) -> Int -> Maybe Int
doCalculus f a = do
b <- t $ a + 1
c <- t $ 2 * b
d <- t $ a + b + c
return d
where t = if f n then Just n else Nothing
例
test :: Int -> Bool
test n = not (n `elem` [3, 7, 9])
*Main> doCalculus test 2
Nothing
*Main> doCalculus test 3
Just 15
*Main>
私はReaderT
いくつかのようなモナドを実行しようとしています
runMaybeTest doCalculus test
として使用する
doCalculus :: Int -> Maybe' Int
doCalculus a = do
b <- a + 1
c <- 2 * b
d <- a + b + c
return d
perform = runMaybe' doCalculus test
しかし、私はできません。
(もちろん、Int
型はモナドにジェネリックになります)
ヒントをありがとう!
=== 更新 1 ===
できます!:) ...しかし、実用的ではありません(私は思う):(
私は素晴らしいエリックキッドの投稿を採用しました
import Prelude hiding (Just, Nothing, return, (>>=))
class Tester a where
test :: a -> Bool
test _ = True
data MMaybe a = Nothing | Just a deriving (Eq, Show)
class Monad1 m a where
return :: a -> m a
fail :: String -> m a
class (Monad1 m a, Monad1 m b) => Monad2 m a b where
(>>=) :: m a -> (a -> m b) -> m b
instance (Tester a) => Monad1 MMaybe a where
return = Just
fail _ = Nothing
instance (Tester a, Tester b) => Monad2 MMaybe a b where
Nothing >>= _ = Nothing
(Just x) >>= f = if test x then f x else Nothing
instance Tester Int where
test n = not $ n `mod` 2 == 0 && n `mod` 3 == 0
test1 :: Int -> MMaybe Int
test1 n =
return n >>= \a ->
return (a + 3) >>= \b ->
return (a + b)
test2 = map test1 [1..20]
考えられる(重要な)問題は次のとおりです。
- 使えるモナドですか?
- do表記はどこですか?
- テスト関数を一意の型に定義するだけで動作します (新しいテスト関数には新しい型が必要です)
しかし、テスト関数を疑似モナドにラップできます... (それは何かです)