2016-10-27 6 views
5

GHC 8.0에서 -XTypeApplications을 사용하면 함수 인수보다 앞에 @ 형식을 명시 적으로 지정할 수 있습니다. 정확히 어떤 유형이 지정됩니까? 특히 @이 여러 개 도입 된 경우? 당신이 함수하스켈에서 TypeApplications를 어떻게 사용합니까?

elem :: (Foldable t, Eq a) => a -> t a -> Bool 

의 유형을 보면

+0

가 나는 경우에 모호성이 없기 때문에 당신이'TypeApplications'을 사용하려는 경우'(을 포섭 또는'TypedScopeVariables') ExplicitForAll'를 사용하는 것이 좋습니다 생각 'const :: forall a b. a -> b -> a'이면 첫 번째'@ '- 인수는'a'를위한 것이고 두 번째 인수는'b'입니다. – Cactus

+0

'ScopedTypeVariables' – dfeuer

답변

5

우리는 두 개의 다형성 변수 ta을 가지고 참조하십시오. 이 변수는 @ 유형 응용 프로그램이 지정하는 것입니다. 컨텍스트에 도입 된 변수는 형식 제약 조건이 순서에 영향을 미치므로 첫 번째 @t을 지정하고 두 번째는 a을 지정합니다. 컨텍스트 변수없이 기능에서

const :: a -> b -> a 

순서는 더욱 명백하다 a 먼저이고 b는 초이다. 위의 주석에서 Cactus가 언급했듯이 명시 적 foralls을 사용하여 직접 주문을 지정할 수도 있습니다.

myConst :: forall b a. a -> b -> a 

이제 첫 번째 유형의 응용 프로그램은 ba 두 번째 지정합니다.

당신은 당신이이 경우에 과부하가 문자열 또는 목록

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 @_ @[]