【问题标题】:Point-free style capitalize function with Ramda使用 Ramda 的无点风格大写函数
【发布时间】:2017-02-22 00:43:25
【问题描述】:

虽然写一个大写函数是微不足道的,例如:

"你好" => "你好" “你好” => “你好”

如何使用 Ramda JS 使用无点样式编写它?

https://en.wikipedia.org/wiki/Tacit_programming

【问题讨论】:

    标签: javascript pointfree ramda.js


    【解决方案1】:

    应该是这样的:

    const capitalize = R.compose(
        R.join(''),
        R.juxt([R.compose(R.toUpper, R.head), R.tail])
    );
    

    Demo(在 ramdajs.com REPL 中)。

    以及处理null值的小修改

    const capitalize = R.compose(
        R.join(''),
        R.juxt([R.compose(R.toUpper, R.head), R.tail])
    );
    
    const capitalizeOrNull = R.ifElse(R.equals(null), R.identity, capitalize);
    

    【讨论】:

    • 作为一个后续问题,当您以无点样式编写时,您将如何处理 null 大小写?如果用 capitalize(null) 调用这个函数,它会爆炸。
    • @TutanRamen 在前面加上ifElse(equals(null), identity, ,否则我认为Maybe monad 会派上用场。
    • 太棒了!现在甚至可以输入isNil 而不是equals(null)
    • ifElse + identity 组合可以替换为更具可读性的 unless 函数:const capitalizeIfNotNil = R.unless(R.isNil, capitalize);
    【解决方案2】:

    我建议使用R.lens:

    const char0 = R.lens(R.head, R.useWith(R.concat, [R.identity, R.tail]));
    
    R.over(char0, R.toUpper, 'ramda');
    // => 'Ramda'
    

    【讨论】:

      【解决方案3】:

      您可以使用在第一个字符上运行 toUpper 的正则表达式部分应用 replace

      const capitalize = R.replace(/^./, R.toUpper);

      【讨论】:

      • 对所提供的答案进行了一些快速而肮脏的基准测试,你的是最快的。
      • replace 的第二个参数是字符串而不是函数。不适合我
      • @DamianGreen Ramda 使用原生 javascript 字符串方法实现 R.replace。第二个参数也可以是一个函数,参见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
      【解决方案4】:

      我为所有感兴趣的人整理了一些快速而肮脏的基准。看起来@lax4mike 是提供的答案中最快的(尽管更简单、非无点的str[0].toUpperCase() + str.slice(1) 更快[而且也不是 OP 所要求的,所以没有实际意义])。

      https://jsfiddle.net/960q1e31/(您需要打开控制台并运行 fiddle 才能看到结果)

      【讨论】:

        【解决方案5】:

        对于任何寻求解决方案的人,该解决方案将首字母大写其余字母也小写,这里是:

        const capitalize = R.compose(R.toUpper, R.head);
        const lowercaseTail = R.compose(R.toLower, R.tail);
        const toTitle = R.converge(R.concat, [capitalize, lowercaseTail]);
        
        toTitle('rAmdA');
        // -> 'Ramda'
        

        【讨论】:

          猜你喜欢
          • 2016-07-11
          • 2017-10-07
          • 2020-07-22
          • 2018-11-12
          • 2017-10-31
          • 1970-01-01
          • 1970-01-01
          • 2018-06-23
          • 1970-01-01
          相关资源
          最近更新 更多