GHC 8.0에서 -XTypeApplications
을 사용하면 함수 인수보다 앞에 @
형식을 명시 적으로 지정할 수 있습니다. 정확히 어떤 유형이 지정됩니까? 특히 @
이 여러 개 도입 된 경우? 당신이 함수하스켈에서 TypeApplications를 어떻게 사용합니까?
elem :: (Foldable t, Eq a) => a -> t a -> Bool
의 유형을 보면
GHC 8.0에서 -XTypeApplications
을 사용하면 함수 인수보다 앞에 @
형식을 명시 적으로 지정할 수 있습니다. 정확히 어떤 유형이 지정됩니까? 특히 @
이 여러 개 도입 된 경우? 당신이 함수하스켈에서 TypeApplications를 어떻게 사용합니까?
elem :: (Foldable t, Eq a) => a -> t a -> Bool
의 유형을 보면
우리는 두 개의 다형성 변수 t
및 a
을 가지고 참조하십시오. 이 변수는 @
유형 응용 프로그램이 지정하는 것입니다. 컨텍스트에 도입 된 변수는 형식 제약 조건이 순서에 영향을 미치므로 첫 번째 @
은 t
을 지정하고 두 번째는 a
을 지정합니다. 컨텍스트 변수없이 기능에서
const :: a -> b -> a
순서는 더욱 명백하다 a
먼저이고 b
는 초이다. 위의 주석에서 Cactus가 언급했듯이 명시 적 foralls을 사용하여 직접 주문을 지정할 수도 있습니다.
myConst :: forall b a. a -> b -> a
이제 첫 번째 유형의 응용 프로그램은
b
과
a
두 번째 지정합니다.
당신은 당신이이 경우에 과부하가 문자열 또는 목록
elem c "abc...xyz" -- What string type is this?
elem c ['a' .. 'z'] -- What list constructor is this?
그러므로 우리가 사용하는 명시 적 유형의 응용 프로그램
elem @[] @Char c ['a' .. 'z']
를 사용하는 경우 특히 유형을 지정할 필요의 문제로 실행할 수 있습니다 우리 만 은 @[]
을 지정하고 "this is a []
list type constructor"이라고 말하면이되고 GHC는 목록 요소에서 Char
을 유추하기 때문에 @Char
은 여기서 생략 할 수 있습니다.
GHC는 추론 할 수있는 다형성 인수가 방금 유형이 [의 부분]을 추론하는 GHC을 말하고, 형 응용 프로그램 서명을 포함하여 유형 서명에 _
을 사용할 수 있습니다 -XPartialTypeSignatures
을 활용할 수 첫째 와서 발생하면 만들 수 사소한 것들은 덜 장황하다. 당신이 들어있는 경우 :
f @_ @[]
가 나는 경우에 모호성이 없기 때문에 당신이'TypeApplications'을 사용하려는 경우'(을 포섭 또는'TypedScopeVariables') ExplicitForAll'를 사용하는 것이 좋습니다 생각 'const :: forall a b. a -> b -> a'이면 첫 번째'@ '- 인수는'a'를위한 것이고 두 번째 인수는'b'입니다. – Cactus
'ScopedTypeVariables' – dfeuer