2017-09-09 3 views
1

이 바로 가기 표기법을 이해할 수 없습니다.Ramda.js - propEq (String → a → Object → Boolean) -이 표기법의 의미는 무엇입니까?

두 가지 예 :

  1. propEq (부울 → → 개체 → 문자열)

  2. sortBy (ORD B => (a →의 b) → [A] → [A])

해독 할 수 있습니까?

그리고 그래, 나는 그것의 문서를 찾는 방법을 알고 있지만,이 문서는 오히려 가난

propEq

을 설명

sortBy

+1

ramda.js가 무엇인지는 모르겠지만 유형 서명과 비슷합니다. – melpomene

+1

카레 타이프 모양입니다. 나는 (매우 희소 한) 문서 (http://ramdajs.com/)에서 시작하여 이것을 사용하는 구체적인 예에 ​​대한 링크로 시작하겠다. – user2864740

+0

예, 읽었지만이 표기법을 설명하지 않았습니다. 어쩌면 그게 분명하지만 나에게는 그렇지 않다. –

답변

1

Ramda이 아니라 이해하기 쉬운 문서를 가지고 그건 확실합니다. 이것이 내가 해석하는 방법입니다. 약간의 명확성을 가져다 주길 바랍니다.

ramda에서는 대부분의 기능이 다 카레되지 않습니다. 즉, ramda의 모든 함수를 필요한 모든 인수 또는 그 이하로 호출 할 수 있습니다. 필요한 수의 인수가 제공되지 않으면 결과는 나머지 인수를 수신 할 수있는 또 다른 함수가됩니다. 함수가 완전히 적용되면 결과를 반환합니다.

예를 들어 propEq을 가져가 보겠습니다. 쓴대로 그 서명은 :

propEq (String → a → Object → Boolean) 

그래서 이것은 무엇을 의미합니까? 먼저 함수가 수행해야하는 작업 : 지정된 객체와 비교하여 객체에서 속성을 가져 와서 비교를 부울로 반환합니다.

우선 맨 오른쪽 속성은 반환 값입니다. 완전히 적용되면 propEq은 부울을 반환합니다. 그래서 마지막 부분은 분명합니다. 그 다음은 남아 :

String → a → Object 

이 내가 위에서 언급 한 인수, 키, 값 및 객체입니다. 그래서 하나의 유효한 호출은 다음과 같습니다

R.propEq('age', 30, { age: 30 }) --> true 

주어진 ramda의 조합 성이 실제로 여러 번 호출로 나눌 수 있습니다

R.propEq('age')(30)({ age: 30 }) --> true 
+0

나는이 대답을 사랑한다! 고마워요 @ 마리오 F! –

1

이 하스켈처럼 많이 보인다. 하스켈에서 당신은 가지고 있습니다 :

sortBy :: (Ord b) => (a -> b) -> [a] -> [a] 

오른쪽에있는 것은 타입 서명입니다.

[A]은 요소의 유형이 A 인 목록 유형입니다.

A -> BA을 사용하고 B을 반환하는 함수 유형입니다.A -> B -> CA -> (B -> C) 수단 A을 취하고 B을 취해 C를 반환하는 함수를 리턴하는 함수, 즉 :

-> 바로 연관된다.

하스켈에는 인수 목록이 없습니다. 대신에 모든 함수는 위에서 설명한 방법으로 카레됩니다. 2 개의 인수의 함수는 실제로 다른 인수를 취하여 실제 결과를 반환하는 다른 함수를 반환하는 하나의 인수의 함수입니다. 이것을 보는 또 다른 방법은 기능 유형이 A1 -> A2 -> ... -> An -> R 인 형식을 말하는 것입니다. 여기서 Ai은 인수 유형이고 R은 결과 유형입니다.

대문자로 시작하는 식별자는 실제 유형입니다. 소문자로 시작하는 식별자는 유형 변수입니다 (원하는 유형으로 사용할 수 있음).

=>은 실제 유형과 유형 제약을 구분합니다. 여기에 Ord b이 있으며 b에 사용 된 유형이 주문 지원 (즉, <, > 작업)을 요구합니다.

는 모두 함께 퍼팅 :

sortBy 유형 a -> b의 인수를 입력 [a] -> [a]의 결과를 돌려주는 기능입니다.

a -> b 유형의 인수는 a 유형의 값을 b 유형으로 매핑하는 또 다른 기능입니다. b은 주문 유형이어야합니다.

유형 [a] -> [a]의 결과는 유형이 a 인 값 목록을 동일한 유형의 목록에 매핑하는 또 다른 기능입니다.

직접 비교해서는 안되는 값 목록을 정렬하려면 각 목록 요소에서 비교 값을 추출하는 도우미 함수와 함께 sortBy을 사용할 수 있습니다. sortBy은 (비교 값에 따라) 정렬 된 목록을 반환합니다.

샘플 사용 :

sortBy length ["don't", "fear", "the", "reaper"] 
=> ["the", "fear", "don't", "reaper"] 

가 여기에 우리가 우리의 aIntString을 사용하여 우리의 b ( length :: String -> Int 때문에). 애플리케이션 기능

참고 연관 남아된다 f x y 실제로 (f x) y 수단 (즉 다음 y에 (다른 함수이어야 함) 결과를 적용 인수 x하는 기능 f 적용).


JavaScript가 어떻게 적용되는지는 잘 모르겠다.

sortBy(getComparisonValue, inputList) 또는 sortBy(getComparisonValue)(inputList)으로 전화 하시겠습니까?

+0

@melpomene, 고맙습니다. 그 개념을 더 잘 이해하는 데 정말로 도움이되었습니다. –

0

나는 Ramda를 개인적으로 알지는 못하지만, 이것은 꽤 명확하게 Haskell 구문입니다.

f :: Type 

f는 유형 Type 뭔가입니다. JS :

var f = Type(...) 

f :: [Type] 

fType와 일도 목록 모두이다. JS :

var f = [Type(...), Type(...), ...] 

f :: Type -> Type 

fType

var f = function(t) { return Type(...) } 
f(Type(...)) 

f :: Type -> Type -> Type 

함수 화살표 (->)의 값을 반환 Type의 값을 취하는 함수가 맞이며 T 연관. 이것은이 fType을 취하고 Type을 취해 Type를 반환하는 함수를 리턴하는 수단

f :: Type -> (Type -> Type) 

동일하다. 이것은 하스켈이 둘 이상의 매개 변수로 함수를 수행하는 방법입니다. 이 기술은 종류

var f = function(l) { return function(r) { return Type(...) } } 
f(Type(...))(Type(...)) 
// Ramda does dark magic that allows you to do vvvv as well 
f(Type(...), Type(...)) 

f :: a -> b -> a 

소문자 식별자 형 변수 무두질이라한다. f의 정의에서 무엇이 ab인지 알 수 없으며 외부 코드가 원하는대로 전달할 수 있습니다. 유형 변수가있는 함수는 "매개 변수"를 만족시킵니다. f은 그것이 할 수있는 일을 제한하는 ab이 어떻게 작동하는지 상관하지 않는다고 약속합니다. 하스켈에서 f는 단지 하나의 가능한 구현이 있습니다. "제약"

var left = function(l) { return function(r) { return l } } 
left(x)(y) === x 
left(1)("a") === 1 
// If it's a Ramda function 
left(1, "a") === 1 

max :: Ord a => a -> a -> a 

(...) =>가 지정을 이 함수는 임의의 유형 인 a에 대해 작동하며, 주문하는 방법은 Ord a으로 표시됩니다. max은 여전히 ​​다소 매개 변수입니다 : 검사 할 수있는 a의 유일한 부분은 순서입니다. 그 이상으로는 분석 할 수 없습니다.

var max = function(a) { return function(b) { return a > b ? a : b } } 
max(1)(94) === 94 
max({})(5) // Not allowed 
// Since {} and 5 aren't the same type, the above call to max is bad 
// JS is not strongly typed enough to warn you, but it just won't work out 
max({})({}) 
// Object does not have an ordering to it, so the above call is bad, 
// because the (Ord a) constraint is violated. 

propEq :: String -> a -> Object -> Boolean 

propEq

문자열, 모든 유형의 몇 가지 값, Object을 소요하고 Boolean을 돌려 그들에게 무언가를.문서에 따르면,

propEq :: String -> a -> (Object -> Boolean) 

이 개체를 일치시키기위한 사실 술어를 반환, 그 속성에 대한 속성 이름과 값을 취으로 생각하는 데 도움이 될 수 있습니다.


sortBy :: (Ord b) => (a -> b) -> [a] -> [a] 

sortBy

는 기능을한다, 그리고 그것은 주문하는 반환 형식이 필요합니다. 그런 다음 a의 목록을 정렬하려면 ab으로 변환 한 다음 Ord b을 사용하여 b을 정렬하는 방법을 파악한 다음 b을 기반으로 a을 정렬하여이 목록을 정렬 할 수 있습니다.

var nameGetter = prop("name") // function(obj) { return obj.name } 
sortBy(nameGetter, [{ name: "Alice" }, { name: "Charlie" }, { name: "Bob" }]) 
// [{ name: "Alice" }, { name: "Bob" }, { name: "Charlie" }]