私はと読んでいます。例文でPurescriptを読んでいて、読者のモナドを紹介しています。この例は次のようになります。読者のモナドを理解する
createUser :: Reader Permissions (Maybe User)
createUser = do
permissions <- ask
if hasPermission "admin" permissions
then map Just newUser
else pure Nothing
わかりやすい部分はask
です。シグネチャは次のとおりです。それは私がState
モナドについて読んでいた薄い空気
のうち、リーダーを作成したかのように表示されます
ask :: forall r. Reader r r
、それはそのget
機能と同じ考え方を持っていました。テキストは説明されました:
状態は、状態モナドのデータコンストラクタによって隠された関数の引数として実装されているため、渡すための明示的な参照はありません。
私はこれが鍵です推測している、と同じことが、リーダーとここに起こっているが、それがどのように動作するか私は理解していない...
上記の例を実行するとrunReader
、どのように経由提供された値はask
の結果として突然表示されますか? ask
のHaskellドキュメントは、次のように言っています。モナド環境を取得します。しかし私の混乱はここから?私がそれを見る方法は、値がrunReader
に渡され、のどこかにが格納され、それを取得する - あなたはask
と呼ぶが、それは意味をなさない。
例はPurescriptですが、私はHaskellの識字者も答えられると考えています。したがって、Haskellタグです。
'Reader a b'は' a - > b 'のラッパーです。だから、 'ask :: forall a。 Reader a a'は最終的に 'forall aの型の値です。 a - > a'、それを囲むラッパーがあります。 –