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 = f
및 g
가 감소 :
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
에서 c
가 const
에 첫 번째 인수에서 온 것을보고 훨씬 더 쉽습니다. 또한 i
과 a
은 무료입니다. 이후에 "작동"할 필요가 없기 때문입니다.
질문 :
GHCI
세션에서 다시 사용되는 문자를 방지 할 수있는 방법이 있나요?GHCI
세션에서 유형 변수를 바인드하고 줄이는 방법이 있습니까?- 마지막으로, 동일한 생각 프로세스를 수행하는 더 쉬운 방법이 있다고 생각합니다.
컴파일러에서 선택하는 tyvar 이름을 제어 할 수 없습니다. 유형 변수를 "바인드 및 축소"하는 것은 나에게 의미가 없다. ('a'와'b'는 그것의 타입에 전혀 나타나지 않기 때문에'fmap. const'에서 모호하지 않습니다). 마지막으로, 저는 여기서 생각한 과정이 무엇인지 모르겠습니다. GHCi에 표현의 유형을 묻는 것처럼 보입니다. – user2407038
제대로 이해했다면 다른 변수에서 같은 유형의 변수 이름을 다시 사용하는 데 문제가 있습니까? 서로 다른 서명은 서로 다른 범위를 가지므로 형식 변수는 서로 전혀 관련이 없습니다. 다른 표현식을 적용하여 표현식을 만들 때 정확한 유형을 찾기 위해 캡쳐 링을하지 않아도되지만 GHCi에 의해 자동으로 수행됩니다 (예 :': t fmap. const '할거야.). 나는 또한이 문맥에서 당신이 "묶고 줄이라"는 의미가 무엇인지 확신하지 못합니다. –
이 문제를 해결할 수있는 다른 방법은': t fmap.const' 유형이 실제로'fmap'과'const'의 형태로 GHCI가 주장하는 것임을 증명하는 것입니다. – sevo