당신이 할 때 일반적으로, 당신은 더 높은 순위 다형성을 사용하여 수신자가 오히려보다는 형식 매개 변수의 값을 선택 할 수 있도록 발신자 . 예를 들면 다음과 같습니다.
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
하나 특히 유용한 응용 프로그램의 범위 지정 사용에 유형 의 범위 지정 시행하는 값 . 미래 또는 콜백과 같은 Action<T>
유형의 결과를 생성하기 위해 실행할 수있는 조치를 나타내는 유형의 오브젝트가 있다고 가정하십시오 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
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)
우리가 줄 때 이제 runAction
을 Action<S, T>
, 우리는 "범위"매개 변수가 있기 때문에 안심하는 S
완벽 다형성, 그것은의 몸을 벗어날 수 없다 runAction
- 그래서 사용하는 형태의 값 S
등이 Resource<S, int>
마찬가지로 벗어날 수 있습니다!
(하스켈에서는,이은으로 알려져 ST
모나드, runAction
호출 runST
, Resource
호출 STRef
및 newResource
호출 newSTRef
).
let sdff = (g : (f : <T> (e : T) => void) => void) => {}