簡體   English   中英

拉姆達:對煙斗感到困惑

[英]Ramda: Confused about pipe

我正在學習JS中的函數式編程,並且正在使用Ramda進行。

我正在嘗試制作一個帶有參數並返回列表的函數。 這是代碼:

const list = R.unapply(R.identity);

list(1, 2, 3); // => [1, 2, 3]

現在,我嘗試使用pipe執行此操作:

const otherList = R.pipe(R.identity, R.unapply);

otherList(1,2,3);
// => function(){return t(Array.prototype.slice.call(arguments,0))}

返回一個奇怪的函數。

這個:

const otherList = R.pipe(R.identity, R.unapply);

otherList(R.identity)(1,2,3); // => [1, 2, 3]

由於某種原因起作用。

我知道這可能是一個新手的問題,但你會如何構建F(G(X))與pipe ,如果f是unapply和g是identity

閱讀R.unapply 文檔 它是一個獲取函數並返回函數的函數,該函數可以采用多個參數,將其收集到單個數組中,並將其作為包裝函數的參數傳遞。

因此,在第一種情況下,它將R.identity轉換為可以接收多個參數並返回數組的函數。

於第二種情況, R.unapply得到的結果R.identity -單個值,而不是功能。 如果將R.identity作為參數傳遞給管道,則R.unapply將獲得一個函數並返回一個函數,這與第一種情況類似。

要使R.unapplyR.pipe一起R.pipe ,您需要將R.pipe傳遞給R.unapply

 const fn = R.unapply(R.pipe( R.identity )) const result = fn(1, 2, 3) console.log(result) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script> 

似乎您確實在考慮錯誤的pipe

當您使用unapply(identity) ,您unapply 函數 identity傳遞給unapply

但是,當您嘗試使用pipe(identity, unapply) ,您將獲得一個函數,該函數將調用identity結果傳遞給unapply

這主要是一個巧合: pipe(identity, unapply)(identity) 將其視為(...args) => unapply(identity(identity))(...args) 由於identity(identity)只是identity ,因此變成(...args) => unapply(identity)(...args) ,可以簡化為unapply(identity) 由於identity的本質,這僅意味着重要的事情。

您將使用unapply將通常將其參數作為數組的函數轉換為可以接受任意數量的位置參數的函數:

sum([1, 2, 3]); //=> 6
unapply(sum)(1, 2, 3) //=> 6

除其他外,這使您可以映射任意數量的位置參數:

unapply(map(inc))(1, 2) //=> [2, 3]
unapply(map(inc))(1, 2, 3) //=> [2, 3, 4]
unapply(map(inc))(1, 2, 3, 4) //=> [2, 3, 4, 5]

identity將始終返回其第一個參數。 所以unapply(identity)(1,2)identity([1,2])

如果您的最終目標是創建一個返回其參數列表的函數,那么我認為您根本不需要pipe unapply(identity)已經在這樣做。

但是,如果您需要確保管道以列表形式獲取其參數,則只需用unapply包裝pipe

const sumplusplus = unapply(pipe(sum, inc, inc));
sumplusplus(1, 2, 3); //=> 8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM