2017-04-16 1 views
2

Ramda docs의 서명을 이해하는 데 문제가 있습니다. 예를 들어 당신이 map를 보면 당신은 볼이어떻게 ramda 워드 프로세서를 읽나요?

Functor f => (a → b) → f a → f b

나는이 패턴이 예를 맞추는 방법을 볼 수 없습니다 :

var double = x => x * 2; 

R.map(double, [1, 2, 3]); //=> [2, 4, 6] 

이 예에서 펑은 [1,2,3], 그래서 어떻게합니까 f의 서명에 넣을 Functor f => (a → b) → f a → f b? 또한 의 의미는 무엇입니까?

+0

여기에서 물어보십시오 : https://gitter.im/ramda/ramda – dfsq

답변

3

여기서 간단한 답변을 드리겠습니다. 그러나보다 완벽한 답변은 a similar question에 대한 두 답변에 걸쳐 적용되며 이는 Ramda wiki page에서 가져 왔습니다. (면책 조항 : 나는 그 페이지의 저자와 Ramda 자체의 원칙 중 하나입니다.) 이것은 두 부분으로 나뉩니다

: 지방 화살표 전에

Functor f => (a → b) → f a → f b 

(=>) 우리가 제약이 나머지. 이 예제의 단일 제약 조건은 변수 fFunctor이어야한다는 것입니다. Functor는 특정 법률을 준수하는 map 메서드가있는 멤버입니다. 선언문은 다른 유형에 대해 매개 변수화되었으므로 어떤 알 수없는 유형 a에 대해 f이나 f String, f Number 또는 일반적으로 f a을 쓰지 않습니다.

스키니 화살표 (->)는 기능 유형의 약어입니다. 그래서 그 대신 쓰기

Function x y 

의 우리가 대신

x -> y 

을 쓸 수 있습니다 또는 모호성을 피하기 위해 필요한 경우.

(x -> y) 

함께 이러한 퍼팅, 우리는 R.map(double, [1, 2, 3]), 우리는 우리의 ab 모두 Number를 것을 의미한다 NumberNumber에서 함수 (double)가 있습니다 할 수 있습니다. 그리고 우리의 펑터는 Array입니다. 이러한 유형의 정의를 전문화하기 위해 Number에서 Number까지 함수를 허용하고 Number의 배열을 사용하고 Number의 새 배열을 반환하는 함수를 반환했습니다. (이 시스템에서는 오른쪽에 ->이 바인딩되어 있기 때문에 (a -> b -> c)(a -> (b -> c))과 같습니다 .Lamda에서 모든 함수는 매개 변수의 초기 집합으로 호출 할 수 있고 모든 조건이 충족 될 때까지 카레트됩니다 따라서 램다 함수를 사용하면 R.map(double)([1, 2, 3])R.map(double, [1, 2, 3]) 사이에는 실제적인 차이가 없습니다.

+0

'Function xy'는 똑같은가요? 'Function x (y)'? – stackjlei

+1

아니요,'Function xy'와 그 약자'x - y'는'x' 타입의 매개 변수를 받아들이고'y' 타입 중 하나를 반환하는 함수를 나타냅니다. 'function (str) {return str.length;}'는'Function String Int' 또는보다 간결하게'String -> Int' 타입을가집니다. –

+1

propEq가 인수로 2 개의 문자열을 받아들이고 부울을 반환하면 왜 propEq는'String → a → Object → Boolean'의 서명을 가지고 있습니까? 'string, string' ->'boolean'이 아닌가? – stackjlei

관련 문제