Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 使函数更通用,以便同时处理sting[]和string_Functional Programming_Ramda.js - Fatal编程技术网

Functional programming 使函数更通用,以便同时处理sting[]和string

Functional programming 使函数更通用,以便同时处理sting[]和string,functional-programming,ramda.js,Functional Programming,Ramda.js,下面是一个示例代码,它对数组中的每个字符串执行2个操作: const R = require( 'ramda' ) const myArray = [ 'one', 'two', 'tree', 'four', 'five' ] function capitalize( x ) { return x.toUpperCase() } function removeLastCharacter( x ) { return x.slice( 0, -1 ) } let

下面是一个示例代码,它对数组中的每个字符串执行2个操作:

const R       = require( 'ramda' )
const myArray = [ 'one', 'two', 'tree', 'four', 'five' ]

function capitalize( x ) {
    return x.toUpperCase()
}

function removeLastCharacter( x ) {
    return x.slice( 0, -1 )
}

let stringManipulator =  R.map( R.compose( capitalize, removeLastCharacter) )
// => [ 'ON', 'TW', 'TRE', 'FOU', 'FIV' ]

您将如何使这个函数在函数的方式上更通用,以便它可以处理字符串数组以及传递给它的简单字符串值?目前,这只适用于字符串数组,而不是字符串。

从理论上讲,拉姆达本身不会创建这样的函数,总是更喜欢只做一件事的简单函数

但写一本自己的并不难。这里有一个解决方案,使用Ramda函数:

var process = (function() {
  var fn = R.compose(R.toUpper, R.slice(0, -1));
  return R.cond([
    [R.is(Array), R.map(fn)],
    [R.T, fn]
  ]);
}());

process(['one', 'two', 'three']); //=> ['ON', 'TW', 'THRE']
process('foobar'); //=> 'FOOBA'
更新

这可能更简单,因为:


谢谢,你的回答总是很感激的。所以在Ramda的情况下,你会喜欢两个独立的简单函数,一个用于数组,一个用于字符串?在Ramda本身,是的,这也是我个人的哲学。但显然这是您自己的代码选择。添加了基于
ifElse
而不是
cond
的更简单版本。
var process = (function() {
  var fn = R.compose(R.toUpper, R.slice(0, -1));
  return R.ifElse(R.is(Array), R.map(fn), fn);
}());