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