2017-03-09 10 views
1

私はタイルの用語を間違っていると思っています。 PureScript by Example, section 8.17 Mutable StatePureScriptの "内部"の数値化タイプ

は、runSTの種類の議論があります:

runST :: forall a eff. (forall h. Eff (st :: ST h | eff) a) -> Eff eff a 

ここで注意すべき事は、領域タイプHは、関数矢印の左側に括弧内に定量化されていることです。つまり、runSTに渡すアクションは、どんな地域でも動作する必要があります。

私が最終的な目標を理解し、誰かがタイプの観点から、この文を明確にすることができますし、どのように、これは上記のとおり制限されますか?

可能であれば、より単純なタイプ(例:どのような違いがありますか:

f1 :: forall i o. Array i -> Array o 
f2 :: forall o. (forall i. Array i) -> Array o 

私は短い例が役立つと思います。

答えて

1

タイプArray aにはどのような値が入りますか?

aが何であるか、またはaについては、具体的な例を挙げることができます。 aIntであることがわかっている場合は、[1, 2, 3]が良い答えです。 aMonoidのインスタンスがある場合は、[mempty]が動作します。しかし、あなたがaについて何も知らないのであれば、確かにあなたが与える唯一の答えは[]です。

タイプforall a. Array aにはどのような値が入りますか?

任意の値がaの場合、Array aに生息する必要があります。 aについては何も知らないので、答えは "[]"です。したがって、forallは、この場合、1つのタイプの実装のみに制約されます。

forall a. Array aは他のタイプと同じように、関数の引数型として現れることがあります。このような関数の呼び出し元として、提供できる値は1つだけです。この関数のの実装者として、のいずれかのタイプaの引数を使用することができます(選択するタイプに関係なく)。

runSTについても同様です。 runSTの作成者は、それが好きなhであなたの行動を呼び出すことができるので、(概念的に)あなたが作業するための新しいメモリ領域を生成します。呼び出し元は、何も知らずに与えられたメモリ領域で作業する必要があります。これは、提供されたアクション(newSTRefwriteSTRefなど)のみを抽象的に使用できることを意味し、作成した参照はrunSTブロックのスコープから離れることはできません(タイプ変数hはそのスコープの外側に存在しません)。 runSTは純粋な結果を安全に返すことができます。

したがって、forallは、関数の引数として提供できる値を制限するのに便利なツールです。

関連する問題