仕組みが理解できませんguard。なぜ型チェックをするのですか?どこかmzeroを返すことはできませんか?m aa /= ()
guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
mzero :: m a
仕組みが理解できませんguard。なぜ型チェックをするのですか?どこかmzeroを返すことはできませんか?m aa /= ()
guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
mzero :: m a
はい、 some whereを返すことmzero ができます。しかし、返すこともできます。この 2 番目のケースで使用します。m aa /= ()m ()guard
これは次のようになります。
n :: Int
n = 5
5Floatまたはにすることができますが、DoubleにすることもできますInt。コンパイラは、5型チェック中に必要な解釈を選択します。
同様に、コンパイラはmzero型チェック中に元の例の正しい型を選択します。より正確には、 am ()が必要であることがわかり、その型が選択されます。
ここで重要なのは、
mzero :: MonadPlus m => m a
実際に意味する
mzero :: forall m a . MonadPlus m => m a
これは、 の呼び出し元がおよび( である限り)mzeroの実際の値を選択できることを示しています。したがって、呼び出し元は、型チェックを行うことを選択できます。この選択は、ユーザーが型注釈を介して行うことができます。そうしないと、コンパイラは型チェック中に正しい選択を推測しようとします。mamMonadPlusa=()