簡體   English   中英

Ramda中的簡單無點功能

[英]Simple Point-free functions in Ramda

我仍在學習Ramda,經常遇到將看似簡單的lamda函數轉換為無點純Ramda函數的麻煩。 這是一個簡單的示例:

export const consoleTap = arg =>
  R.compose(
    R.tap,
    R.curryN(2, console[arg])
  );

export const errorTap = consoleTap("error");
export const logTap = consoleTap("log");

// example usage
R.map(logTap("Value"))([1, 2]) // Results in printing "Value 1" "Value 2"

這些功能運行良好,我什至為它們編寫了測試。 我只是覺得consoleTap可以寫成沒有意義的東西,只是有些我沒有正確看到或理解。 可以重寫功能嗎?

我無法提出一種看上去不太復雜的無點版本。 我認為您所擁有的已經很不錯了。

我唯一提出的建議是將事情分解:將記錄與tap分開。 您可以自己重用日志的“前綴”版本:

const logWith = (method, prefix) => curryN(2, console[method])(prefix);
const log = logWith('log', 'INFO: ');
const error = logWith('error', 'ERR: ');
log(10); // INFO: 10
error(10); // ERR: 10

tap

const logTap = tap(logWith('error', 'ERR: '));
logTap(10);
// ERR: 10
// => 10

您遇到的問題是由於R.tap不可變。

 // tap is a unary function const log = R.tap(console.log); // logs only `1` log(1, 2, 3, 4); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js" integrity="sha256-xB25ljGZ7K2VXnq087unEnoVhvTosWWtqXB4tAtZmHU=" crossorigin="anonymous"></script> 

因此,您無法執行log('Value is, 1) ,一種解決方法是將tap參數與R.unapply分組,然后通過R.apply將其應用回記錄器


一個簡單的解決方案是在為記錄器提供前綴后調用R.tap

 const logger = R.pipe( R.prop(R.__, console), R.curryN(2), ); const error = logger('error'); const log = logger('log'); const result = R.map( R.tap(log('value is')), )([1, 2]); // tap didn't alter any item inside the functor. console.log('result is', result) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js" integrity="sha256-xB25ljGZ7K2VXnq087unEnoVhvTosWWtqXB4tAtZmHU=" crossorigin="anonymous"></script> 


暫無
暫無

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

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