不确定是否只遍历字符串一次。听起来很难。不过,我将提供一些不同的方法来获得乐趣和洞察力。
函数的 monoid 实例将通过使用给定参数运行所有函数并连接它们的结果来连接每个函数(它们必须都返回相同的类型才能正确组合)。replaceMe
正是这样做的,所以我们可以使用mconcat
。
const { compose, head, tail, replace, toUpper } = require('ramda')
const { mconcat } = require('pointfree-fantasy')
// fun with monoids
const replaceTail = compose(replace(/-/g, ' '), tail)
const upperHead = compose(toUpper, head)
const replaceMe = mconcat([upperHead, replaceTail])
replaceMe("replace-me-correctly")
//=> "Replace me correctly"
这是组合功能的一种有趣方式。我不确定为什么要求tail
在replace
. 似乎replace
可以更新该函数以-
通过正则表达式替换任何过去的起始字符。如果是这种情况,我们可以内联replace
.
还有一件事。dimap
Profunctor的函数实例非常简洁,lens 也是如此。将它们一起使用,我们可以将字符串转换为数组,然后toUpper
只是第 0 个索引。
const { curry, compose, split, join, head, replace, toUpper } = require('ramda')
const { mconcat } = require('pointfree-fantasy')
const { makeLenses, over } = require('lenses')
const L = makeLenses([])
// fun with dimap
const dimap = curry((f, g, h) => compose(f,h,g))
const asChars = dimap(join(''), split(''))
const replaceMe = compose(replace(/-/g, ' '), asChars(over(L.num(0), toUpper)))
replaceMe("replace-me-correctly")
//=> "Replace me correctly"