2

仕組みが理解できませんguard。なぜ型チェックをするのですか?どこかmzeroを返すことはできませんか?m aa /= ()

guard           :: (MonadPlus m) => Bool -> m ()
guard True      =  return ()
guard False     =  mzero

mzero :: m a 
4

1 に答える 1

11

はい、 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=()

于 2015-02-19T12:48:16.637 に答える