하스켈에서 펑터를 공부할 때 Functor.Indexed 유형의 펑터를 생각해 냈습니다. 이 펑터는 imap
이라는 연산을 정의합니다. 나는 그 정의와 imap
서명을 이해하지 못했다 : imap :: (a -> b) -> f j k a -> f j k b
. 나는 그것의 공식적인 정의를 발견하려고 노력하고 오직 이것을 발견했다 : http://ncatlab.org/nlab/show/indexed+functor. 그러나 그것은 전혀 전혀 도움이되지 못했습니다. 그래서 누군가가 더 간단한 단어로 이런 종류의 펑터를 명확히 할 수 있습니까? 그리고 어떤 경우에 그것을 사용해야합니까? 감사.하스켈에서 색인 된 펑터는 무엇이며 그 용도는 무엇입니까?
답변
인덱싱 된 펑터는 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'
올바르게 이해했다면'runIxState :: i -> (a, j)'이어야합니다, 그렇지 않아야합니까? 그리고이 정말 좋은 설명을 주셔서 감사합니다. 이제 마침내 저에게 의미가 있습니다 ... – phg
'동시에 모폴로지를 구성합니다' –
내 느낌 인덱스 펑 뒤에 의욕 만 인덱스 _applicative_ 펑, 또는 인덱싱 된 모나드보고 이해할 수 있다는 것입니다. 이것들은'<*>'또는'>> ='을 사용할 때 (인덱스의) 타입을 변경할 수 있다는 점을 제외하면 인덱스가없는 부분과 같습니다. 따라서, 인덱스는 예를 들면 다음과 같이 사용될 수있다. 'allocSomeData :: M Zero One T1'과'allocSomeOtherData :: M One Two T2' 그리고'do d1 <- allocSomeData; 당신이 가지고있는 부작용을 추적 할 수 있습니다. d2 <- allocSomeOtherData; return (d1, d2) :: M 제로 2 (T1, T2)'이중 할당이 유형에 반영됩니다. – chi