2017-08-20 13 views
6

Từ documentation:Ramda sử dụng chuỗi

var duplicate = n => [n, n]; 
R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3] 
R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1] 

Ví dụ đầu tiên là rất thẳng về phía trước, nó áp dụng lặp lại() để mọi phần tử trong mảng và concatenates kết quả. Nhưng tôi không hiểu được ví dụ thứ hai. Làm thế nào chính xác là nó ánh xạ R.append + R.head trên mảng? Ai đó có thể vui lòng cung cấp giải thích từng bước cho ví dụ thứ hai không?

Tôi quen với việc soạn và pha cà ri.

Cảm ơn

Trả lời

9

Ví dụ thứ hai được thể hiện như thế nào R.chain thể được sử dụng những thứ khác hơn mảng, chẳng hạn như các chức năng (hoặc bất cứ điều gì thực hiện spec Ảo đất chain).

Nếu khái niệm ánh xạ và sau đó ghép một mảng là quen thuộc với bạn, bạn có thể nghĩ về ánh xạ hàm trên hàm khác dưới dạng thành phần hàm đơn giản. Phần ghép nối sẽ yêu cầu giải thích thêm.

R.chain tuyên bố chữ ký của mình như:

Chain m => (a → m b) → m a → m b 

Đối với mảng, chúng ta có thể trao đổi các m với [] để có được:

(a → [b]) → [a] → [b] 

Đối với chức năng mà nhận được một số lập luận r, nó trở thành:

(a → r → b) → (r → a) → (r → b) 

Vì vậy, chỉ với những kiến ​​thức về những loại có sẵn, cách duy nhất để sản xuất thức r → b chức năng là phải làm như sau:

  • Vượt qua nhận lập luận r đến chức năng thứ hai để tạo ra một a
  • Áp dụng cả mới a và bản gốc r đến chức năng đầu tiên để tạo ra kết quả b

Hoặc trong mã:

// specialised to functions 
const chain = (firstFn, secondFn) => 
    x => firstFn(secondFn(x), x) 

Việc trao đổi trong chức năng từ ví dụ này, bạn có thể nhìn thấy nó trở thành:

x => R.append(R.head(x), x) 

Nếu bạn đã quen thuộc với R.converge thì đây là một cách hiệu quả:

R.converge(firstFn, [secondFn, R.identity]) 
+1

Cảm ơn bạn rất nhiều vì đã giải thích, bây giờ điều đó có ý nghĩa hơn với tôi. – user941749

+1

Giải thích tốt nhất tôi đã nhìn thấy điều này chưa! – Jolleyboy

+0

Thành thật mà nói tôi vẫn không hiểu. Có phải đó là hàm R.chain có một thứ cho mảng và một thứ khác cho các hàm? Hai chức năng đó có được hợp nhất thành một không?Can dạng: chuỗi const = (firstFn, secondFn) => x => firstFn (secondFn (x), x) cũng được thực hiện để làm cho ý nghĩa đối với các trường hợp mảng? Trong trường hợp đó hàm nào sẽ là secondFn? –

-1

Hope this helps

let R = require('ramda') 

// using vanillajs 
let append = (arr1) => (arr2) => arr2.concat(arr1) 
let double = (arr1) => arr1.map(x => 2*x) 

let chain = (f, g) => arr => { 
    let yarr = g(arr) 
    return f(yarr)(arr) 
} 

console.log(chain(
    append, 
    double 
)([10, 15, 20])) 

//using Ramda 
console.log(R.chain(append, double)([10, 15, 20])) 
Các vấn đề liên quan