0

のデータ型としてを選択しmonadPlusSDifた場合、両方の関数は同等ですか?MaybeMonadPlus

tdif :: Int -> Int -> Maybe Int
tdif x y
    | y == 0 = Nothing
    | otherwise = Just (div x y)

monadPlusSDif :: MonadPlus m => Int -> Int -> m Int
monadPlusSDif x y = guard (y /= 0) >> return (div x y)
4

2 に答える 2

5

の場合、これらの関数は同等の動作をm ~ Maybeしますが、コンパイルされたバイトコード表現は異なる可能性があります。MonadPlus次のように、一般的なモナドの実際のガードを使用して実装することもできます。

monadPlusSDif :: MonadPlus m => Int -> Int -> m Int
monadPlusSDif x y
    | y == 0 = mzero
    | otherwise = return $ x `div` y

次に、次のように使用できます

bigEquation :: Int -> Int -> Maybe Int
bigEquation x y = do
    z1 <- monadPlusSDif x y
    z2 <- monadPlusSDif (x + y) (x - y)
    z3 <- monadPlusSDif y x
    return $ z1 + z2 * z3

Maybeコンパイラは、そのコンテキストでforを使用する必要があることを理解できますm

于 2014-01-24T17:24:09.960 に答える