2016-08-21 3 views
0

나는 그것이 무엇을 이해하려고 노력 곳의 간단한 예로서 fmap . const을 보자바인딩 형태 변수

fmap :: Functor f => (a -> b) -> f a -> f b 
const :: a -> b -> a 

내가 알 주먹 것은 내가 이해하려고 할 때 a, b이 모호하다는 것이다 fmap . const. 두 개 이상의 관련 서명을 함께 사용하면 "GHCI 세션"을 의미합니다.

fmap :: Functor f => (a -> b) -> f a -> f b 
const :: c -> d -> c 
fmap . const :: Functor g => h -> g i -> g h 

하자 바인드 g = fg가 감소 :

fmap . const :: Functor f => h -> f i -> f h 

pointful 버전에 대한 최소 혼란 변수 이름으로 h :: h을 선택 여기

나를 더 나은 일을 이해하는 데 도움이 될지의 예입니다 :

\h -> fmap (const h) :: Functor f => h -> f i -> f h 

하자 h = c을 결합하고 h을 줄일 :

\c -> fmap (const c) :: Functor f => c -> f i -> f c 

지금은 f c에서 cconst에 첫 번째 인수에서 온 것을보고 훨씬 더 쉽습니다. 또한 ia은 무료입니다. 이후에 "작동"할 필요가 없기 때문입니다.

질문 :

  • GHCI 세션에서 다시 사용되는 문자를 방지 할 수있는 방법이 있나요?
  • GHCI 세션에서 유형 변수를 바인드하고 줄이는 방법이 있습니까?
  • 마지막으로, 동일한 생각 프로세스를 수행하는 더 쉬운 방법이 있다고 생각합니다.
+1

컴파일러에서 선택하는 tyvar 이름을 제어 할 수 없습니다. 유형 변수를 "바인드 및 축소"하는 것은 나에게 의미가 없다. ('a'와'b'는 그것의 타입에 전혀 나타나지 않기 때문에'fmap. const'에서 모호하지 않습니다). 마지막으로, 저는 여기서 생각한 과정이 무엇인지 모르겠습니다. GHCi에 표현의 유형을 묻는 것처럼 보입니다. – user2407038

+0

제대로 이해했다면 다른 변수에서 같은 유형의 변수 이름을 다시 사용하는 데 문제가 있습니까? 서로 다른 서명은 서로 다른 범위를 가지므로 형식 변수는 서로 전혀 관련이 없습니다. 다른 표현식을 적용하여 표현식을 만들 때 정확한 유형을 찾기 위해 캡쳐 링을하지 않아도되지만 GHCi에 의해 자동으로 수행됩니다 (예 :': t fmap. const '할거야.). 나는 또한이 문맥에서 당신이 "묶고 줄이라"는 의미가 무엇인지 확신하지 못합니다. –

+0

이 문제를 해결할 수있는 다른 방법은': t fmap.const' 유형이 실제로'fmap'과'const'의 형태로 GHCI가 주장하는 것임을 증명하는 것입니다. – sevo

답변

0

서명의 형식 변수는 실제로 암시 적 범용 한정 기호로 바인딩됩니다.

{-# LANGUAGE ExplicitForAll #-} 

fmapPrime :: forall a b f. Functor f => (a -> b) -> f a -> f b 
fmapPrime = fmap 

constPrime :: forall a b. a -> b -> a 
constPrime = const 

fmapConst :: forall a b f. Functor f => b -> f a -> f b 
fmapConst = fmap . const 

그래서 당신이 형태 변수 변수 "재사용"것을 말할 수 없다 : 그들은 무료로하지 않습니다이 컴파일 확인, 그것을 명시 적으로 만들 수있는 언어 확장이있다.