一般に、呼び出し先ではなく、呼び出し元ではなく型パラメーターの値を選択できるようにする場合は、上位のポリモーフィズムを使用します。例えば:
f :: (forall a. Show a => a -> Int) -> (Int, Int)
f g = (g "one", g 2)
任意の機能g
私は、これに合格していることは、f
私に与えることができなければならないInt
いくつかの型の値からだけの事はg
、そのタイプを知っている、それはのインスタンスを持っていることですShow
。これらはコーシャです:
f (length . show)
f (const 42)
しかし、これらはそうではありません:
f length
f succ
1つの特に有用なアプリケーションは、値のスコープを強制するために型のスコープを使用することです。typeのオブジェクトがあり、futureやコールバックなどAction<T>
、typeの結果を生成するために実行できるアクションを表すとしT
ます。
T runAction<T>(Action<T>)
runAction :: forall a. Action a -> a
ここで、オブジェクトAction
を割り当てることができるを持っているとしResource<T>
ます:
Action<Resource<T>> newResource<T>(T)
newResource :: forall a. a -> Action (Resource a)
これらのリソースは、それらが作成された場所内でのみ使用Action
され、異なるアクション間または同じアクションの異なる実行間で共有されないように強制します。
上位の型を使用S
して、Resource
and Action
型にパラメーターを追加することでこれを達成できます。これは完全に抽象的です。これはの「スコープ」を表しAction
ます。署名は次のとおりです。
T run<T>(<S> Action<S, T>)
Action<S, Resource<S, T>> newResource<T>(T)
runAction :: forall a. (forall s. Action s a) -> a
newResource :: forall s a. a -> Action s (Resource s a)
私たちが与えたときに今、私たちは、「スコープ」のパラメータがあるためと確信している、完全に多型である、それはの本体を免れることはできない-SO使用するタイプのいずれかの値などが同様に逃げることができませんの!runAction
Action<S, T>
S
runAction
S
Resource<S, int>
(Haskellでは、これはST
モナドとして知られており、どこrunAction
で呼ばれrunST
、Resource
呼ばれSTRef
、そしてnewResource
呼ばれnewSTRef
ます。)
let sdff = (g : (f : <T> (e : T) => void) => void) => {}