[英]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.unapply
與R.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.