GHC의 ScopedTypeVariables
은 기능 패턴에서 유형 변수를 바인딩 할 수 있지만 패턴은 사용할 수 없음을 알아 챘습니다.하스켈의 범위 변수가 패턴 바인딩에서 변수의 바인딩을 허용하지 않는 이유는 무엇입니까?
fooType :: Foo -> TypeRep
fooType (Foo x) =
let (_ :: a) = x
in typeRep (Proxy::Proxy a)
을하지만,이 트릭을 사용 : 나는 푸 내부 유형에 액세스하려면 최소한의 예를 들어
이 유형data Foo where Foo :: Typeable a => a -> Foo
을 고려, 다음 함수는 컴파일되지 않습니다 형식 변수 바인딩을 함수 호출로 이동하려면 문제없이 작동합니다.
let
바인딩은 실제로 위장의 함수 바인딩이기 때문에 위의 두 코드 스 니펫은 왜 동일하지 않습니까?
x :: a
으로 직접 변수를
typeOf x
로
TypeRep
을 만들거나 결합하는 것입니다. 이러한 옵션 중 어느 것도 내 진짜 코드에서 사용할 수 있으며, 그들을 '아무튼 사용 질문에 대답 해주세요.)
: 코드에 관해서는
는
ScopedTypeVariables
실제로 당신에게 훨씬 더 간결 옵션을 제공합니다'fooType (푸 X)를 = typeRep [X] '는'typeRep'에 대한'proxy'가 임의의 펑터가 될 수 있다는 사실을 이용하여 작동합니다 : 반드시 사소한'Proxy'가 아니라 실제로'a' 값을 포함 할 수도 있습니다! – leftaroundabout@leftaround 우리가 타입 변수를 없애고 있다면 더 멀리 가서'fooType (Foo x) = typeOf x'라고 말할 수 있습니다. 나는 앞서 가서 실제 사용 케이스가 타입 변수에 대한 액세스를 갖는 것이 중요한 부분이라고 생각했습니다. – Carl
@Carl yeah하지만 실제로'x' 값을 포함하는 구체적인 컨테이너로'proxy x' 인수를 가진 _any_ 함수를 호출 할 수 있다는 것은 일반적으로 알려져 있지 않습니다. – leftaroundabout