이 바로 가기 표기법을 이해할 수 없습니다.Ramda.js - propEq (String → a → Object → Boolean) -이 표기법의 의미는 무엇입니까?
두 가지 예 :
propEq (부울 → → 개체 → 문자열)
sortBy (ORD B => (a →의 b) → [A] → [A])
해독 할 수 있습니까?
그리고 그래, 나는 그것의 문서를 찾는 방법을 알고 있지만,이 문서는 오히려 가난
을 설명이 바로 가기 표기법을 이해할 수 없습니다.Ramda.js - propEq (String → a → Object → Boolean) -이 표기법의 의미는 무엇입니까?
두 가지 예 :
propEq (부울 → → 개체 → 문자열)
sortBy (ORD B => (a →의 b) → [A] → [A])
해독 할 수 있습니까?
그리고 그래, 나는 그것의 문서를 찾는 방법을 알고 있지만,이 문서는 오히려 가난
을 설명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
나는이 대답을 사랑한다! 고마워요 @ 마리오 F! –
이 하스켈처럼 많이 보인다. 하스켈에서 당신은 가지고 있습니다 :
sortBy :: (Ord b) => (a -> b) -> [a] -> [a]
오른쪽에있는 것은 타입 서명입니다.
[A]
은 요소의 유형이 A
인 목록 유형입니다.
A -> B
은 A
을 사용하고 B
을 반환하는 함수 유형입니다.A -> B -> C
가 A -> (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"]
가 여기에 우리가 우리의
a
및
Int
로
String
을 사용하여 우리의
b
(
length :: String -> Int
때문에). 애플리케이션 기능
참고 연관 남아된다 f x y
실제로 (f x) y
수단 (즉 다음 y
에 (다른 함수이어야 함) 결과를 적용 인수 x
하는 기능 f
적용).
JavaScript가 어떻게 적용되는지는 잘 모르겠다.
sortBy(getComparisonValue, inputList)
또는 sortBy(getComparisonValue)(inputList)
으로 전화 하시겠습니까?
@melpomene, 고맙습니다. 그 개념을 더 잘 이해하는 데 정말로 도움이되었습니다. –
나는 Ramda를 개인적으로 알지는 못하지만, 이것은 꽤 명확하게 Haskell 구문입니다.
f :: Type
f
는 유형 Type
뭔가입니다. JS :
var f = Type(...)
f :: [Type]
f
형 Type
와 일도 목록 모두이다. JS :
var f = [Type(...), Type(...), ...]
f :: Type -> Type
f
가 Type
var f = function(t) { return Type(...) }
f(Type(...))
f :: Type -> Type -> Type
함수 화살표 (->
)의 값을 반환 Type
의 값을 취하는 함수가 맞이며 T 연관. 이것은이 f
가 Type
을 취하고 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
의 정의에서 무엇이 a
과 b
인지 알 수 없으며 외부 코드가 원하는대로 전달할 수 있습니다. 유형 변수가있는 함수는 "매개 변수"를 만족시킵니다. f
은 그것이 할 수있는 일을 제한하는 a
과 b
이 어떻게 작동하는지 상관하지 않는다고 약속합니다. 하스켈에서 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
의 목록을 정렬하려면
a
을
b
으로 변환 한 다음
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" }]
ramda.js가 무엇인지는 모르겠지만 유형 서명과 비슷합니다. – melpomene
카레 타이프 모양입니다. 나는 (매우 희소 한) 문서 (http://ramdajs.com/)에서 시작하여 이것을 사용하는 구체적인 예에 대한 링크로 시작하겠다. – user2864740
예, 읽었지만이 표기법을 설명하지 않았습니다. 어쩌면 그게 분명하지만 나에게는 그렇지 않다. –