私は次の単純化されたコードを持っています (実際のコードは意味のあるものを実装しています):
import Data.Char
import Data.Maybe
import Control.Monad
import Control.Applicative
testA :: [Int] -> Maybe Int -> Maybe Int
testA [] _ = Nothing
testA _ Nothing = Nothing
testA (x:xs) v = case x of
1 -> (+) <$> v <*> return x
otherwise -> testA xs v
testB :: (MonadPlus m, Applicative m) => [Int] -> m Int -> m Int
testB [] _ = mzero
testB _ mzero = mzero
testB (x:xs) v = case x of
1 -> (+) <$> v <*> return x
otherwise -> testB xs v
main = do
let xpto = testA [1,2,3,1,5] (Just 5)
print xpto
let ypto = testB [1,2,3,1,5] (Just 5)
print ypto
私は、testA と testB が Maybe モナドをフィードしたときに同じように動作する必要があることを理解しています。つまり、mzero は Nothing に変換する必要があります。
ただし、テスト B ghc では、実際には警告が表示されます。
Pattern match(es) are overlapped
In an equation for `testB': testB (x : xs) v = ..
そして出力は異なります:
Just 6 (correct)
Just 5 (incorrect)
何が欠けているのかわからないのですが、パターン マッチで mzero が何も意味しないのはなぜですか?