2017-12-25 6 views
0

나는 그 문서는 R.chain와 그 배열의 하나가 (끝)에 배열의 첫 번째 값을 추가하는 방법을 설명 buzzdecafe's Chain chain chain article

이해하려고 노력하고 있어요 '체인' , 그리고 그것이 작동하는 이유. 그는

헤드 타입 m의 것을 쓴다 다섯 번째 마지막 단락에서

const f = chain(append, head); //=> f :: [x] -> [x]` 
f([1, 2, 3]); //=> [1, 2, 3, 1] 

그냥 그렇게하지 않는 함수형 프로그래밍을 실험하기 시작했다 사람으로

.

배열에서 기능으로 또는 그 반대로 여러 종류의 체인에서 기사로 진행되는 대체를 완전히 이해하지 못합니다.

R.chain의 유형은 다음과 같습니다

(a -> m b)   -> m a  -> m b 

내가 체인 함수가 될 수 있다는 것을 이해합니다. 따라서 R.append는 x → [x] → [x] 형식을 a -> m b으로 다시 쓸 수 있으며 R.chain 형식의 첫 번째 부분에 맞습니다. 나는 우리가 이제 m b[x] -> [x]이되도록 정의 했으므로 마지막 m b[x] -> [x]으로 대체되어야합니까? 우리는 같을 것이다 가지고있는 경우에

:

(a -> [x] -> [x]) -> m a  -> ([x] -> [x]) 

그리고

A와 X는 우리가 (이 경우 번호에) 동일한 유형이 될 것입니다 때문에 : 그래서

(x -> [x] -> [x]) -> m x  -> ([x] -> [x]) 

을 첫 번째 과거는 R.append와 일치합니다. 끝은 반환 된 함수의 유형과 일치합니다. 좋아요, 일종의 생각입니다 ...

... 그 사이에 m x은 R.head에 어떻게 맞습니까? m x은 x 유형의 것을 반환하는 함수가 될 수 있습니까? 승인? 그러나 그 기능에 대한 투입물은 어떻습니까? 어떻게하면 [x]이 R.chain 유형과 호환되는 유효한 입력이되고 나머지는 수식 조작을 볼 수 있고 이해할 수 있습니까? > (X - -> a) -> (X -> B)

쇄 : (-> (X -> b) a)이가는로부터

답변

1

이미 이해 했으므로 여기서 m b은 "x을 취하고 b을 반환하는 함수"로 해석합니다. 따라서 m a은 "x을 취하고 a을 반환하는 함수"가됩니다.

(I 다른 x ES 사이의 혼동을 피하기 위해 y를 사용합니다) concat의 서명이 나란히 비교 :

(a -> (x -> b)) 
y -> [y]-> [y] 

우리는 ay 것을 볼 수 x[y]입니다, b[y]입니다. 따라서 x을 사용하고 a을 반환하는 함수는 [y] -> y이라는 부호를 가지며 이는 정확히 head의 서명입니다.

그래서 우리가 마지막에 무슨이다 :

append     head 
a -> m b    m a    m b 
a -> x -> b  -> (x -> a) -> (x -> b) 
(y -> [y] -> [y]) -> ([y] -> y) -> ([y] -> [y]) 

최대 분명히 그 도움을합니까?

이 보는 또 다른 방법은 그 fg는 두 기능, 경우 :

chain(f, g)(x) is equivalent to f(g(x), x) 

거의 우리가 Ramda source에서 볼 것입니다 :이에서

fn(monad(x))(x) 

은 , 다음과 같은 경우에 fgchain-able입니다.

  • g(x)f
  • f의 최초의 파라미터와 동일한 종류 가지고 두번째 매개 변수가 g 동일한 유형의 제 파라미터
+0

감사합니다 당신은 그것을 매우 간단하게 보였습니다. 저는 더 많이 이해합니다. 그러나 "왜 x는 x를 취하는 함수가 될 것인가"라는 이유를 이해하지 못합니다. 모든 "m"*은 입력과 동일한 유형을 가져야합니까? 나는 'm a'와 'm b'가 서로 다른 결과 (a와 b)를 가지기 때문에 혼란 스럽다고 생각합니다. 그래서 입력이 동일해야합니다. –

+0

('x -> a'및 'x -> b'의 x)입니다. –

+1

@ taz0k 이해할 수 있듯이,'mb '의'm'은'b' 부분 이외의'mb'를 정의하는 것과 관련된 것으로 볼 수 있습니다. 그래서'mb'가''x''를 반환하고''b''를 반환하는 함수이면''m''은''x''를 취하고 a를 반환하는 함수를 가리 킵니다. "_ 그 부분. 'x -> a'와 'x -> b'사이의 'x ->'부분은 그들이 공통적으로 가지고있는 부분이고 ("m"으로 캡슐화되어있다), "a"또는 "b"부분은 무엇이 구별되는지 그것들은'm'과'mb'의 외부에있는 이유입니다. – JLRishe