2015-01-04 4 views
16

하스켈에서 펑터를 공부할 때 Functor.Indexed 유형의 펑터를 생각해 냈습니다. 이 펑터는 imap이라는 연산을 정의합니다. 나는 그 정의와 imap 서명을 이해하지 못했다 : imap :: (a -> b) -> f j k a -> f j k b. 나는 그것의 공식적인 정의를 발견하려고 노력하고 오직 이것을 발견했다 : http://ncatlab.org/nlab/show/indexed+functor. 그러나 그것은 전혀 전혀 도움이되지 못했습니다. 그래서 누군가가 더 간단한 단어로 이런 종류의 펑터를 명확히 할 수 있습니까? 그리고 어떤 경우에 그것을 사용해야합니까? 감사.하스켈에서 색인 된 펑터는 무엇이며 그 용도는 무엇입니까?

+5

내 느낌 인덱스 펑 뒤에 의욕 만 인덱스 _applicative_ 펑, 또는 인덱싱 된 모나드보고 이해할 수 있다는 것입니다. 이것들은'<*>'또는'>> ='을 사용할 때 (인덱스의) 타입을 변경할 수 있다는 점을 제외하면 인덱스가없는 부분과 같습니다. 따라서, 인덱스는 예를 들면 다음과 같이 사용될 수있다. 'allocSomeData :: M Zero One T1'과'allocSomeOtherData :: M One Two T2' 그리고'do d1 <- allocSomeData; 당신이 가지고있는 부작용을 추적 할 수 있습니다. d2 <- allocSomeOtherData; return (d1, d2) :: M 제로 2 (T1, T2)'이중 할당이 유형에 반영됩니다. – chi

답변

18

인덱싱 된 펑터는 spacesuitburritoesque 문구를 사용하여 "매핑이 포함 된 컨테이너"입니다. 나는. 값 f j k a은 어떤 형태의 모프 즘을 포함합니다 (j -> k).의 값 (함수 일 필요는 없으며보다 일반적인 화살표 일 수 있음)도 포함됩니다.

값이 a 인 경우 컨테이너는 분명한 방법으로 기능을합니다. 사실 자체에 IxFunctor 클래스는 꽤 ​​지루 -

instance IxFunctor f 

는 흥미로운 도착 위치를보다 구체적인 펑터 클래스를 고려할 때입니다, 이제 기본적으로

instance Functor (f j k) 

과 동일합니다. 이 모나드 하나가 Indexed 모듈에서 실제로 아니지만, 내가 가장 분명한 점하게 생각 :

class IxPointed f => IxMonad f where 
    ijoin :: m j k (m k l a) -> m j l a 

이 나란히 비교 :

(>>>) :: (j->k) -> (k->l) -> j->l 
ijoin :: m j k (m k l a) -> m j l a 
join :: m  (m  a) -> m  a 

그래서 우리가하는 일이이다, "컨테이너 레이어"에 참여하는 동안 의 변형을 구성합니다.

명백한 예가 IxState입니다.

newtype State s a = State { runState :: s -> (a, s) } 

이, 모나드로 사용하는 경우, 단순히 함수의 s -> s 측면을 구성하는 표준 상태 모나드를 기억 :

join (State f) = State $ \s -> let (State f', s') = f s in f' s' 

그래서 당신이 다음 f'을 통해, f을 통해 먼저 상태를 스레드. 글쎄, 우리가 모든 주들이 같은 타입을 가질 필요가없는 이유는 없지, 그렇지? 결국 중간 상태는 다음 동작으로 전달됩니다. 여기에 인덱스 상태 모나드,

newtype IxState i j a = IxState { runIxState :: i -> (a, j) } 

입니다 그것은 않습니다 단지 :

ijoin (IxState f) = IxState $ \s -> let (IxState f', s') = f s in f' s' 
+1

올바르게 이해했다면'runIxState :: i -> (a, j)'이어야합니다, 그렇지 않아야합니까? 그리고이 정말 좋은 설명을 주셔서 감사합니다. 이제 마침내 저에게 의미가 있습니다 ... – phg

+0

'동시에 모폴로지를 구성합니다' –