在 Ramda.js 中,为什么必须使用恒等式才能使 `R.countBy()` 起作用?

In Ramda.js, why must use identity to get `R.countBy()` to work?

如果这是重复的,我深表歉意。我没有在其他地方找到答案。

Ramda.js 提供了 countBy() 功能。从文档中我们可以看到:

const R = require("ramda")

const letters = ['a', 'b', 'A', 'a', 'B', 'c'];
R.countBy(R.toLower)(letters);   //=> {'a': 3, 'b': 2, 'c': 1}

但是如果我们已经有了小写的 letters 怎么办?也就是说,我们不需要任何额外的步骤,而只是计算。例如,假设我想简单地计算 letters2 数组:

const letters2 = ["a", "a", "a", "a", "b", "b", "c", "c", "c", "c"]
R.countBy(letters2) // doesn't work

相反,我们必须添加一些标识表达式,例如:

R.countBy(x => x)(letters2)
// gives {"a": 4, "b": 2, "c": 4}

R.countBy(R.identity)(letters2)

其他 Ramda 函数(例如 R.isNil())并非总是如此。我试图了解身份的这一额外步骤从何而来。对我来说似乎没有必要,但我可能遗漏了一些东西。

谢谢!

原因是 ramda 根本没有对您希望如何计算列表做出任何假设...

const  list = ['A', 'b', 'c', 'D', 'e', 'f', 'g', 'G', 'F'];

// simply count
console.log(
  R.countBy(R.identity, list),
)


// or count case insensitively
console.log(
  R.countBy(R.toLower, list),
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.js" integrity="sha512-ZZcBsXW4OcbCTfDlXbzGCamH1cANkg6EfZAN2ukOl7s5q8skbB+WndmAqFT8fuMzeuHkceqd5UbIDn7fcqJFgg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>


此外,不要忘记您可以利用部分应用程序来构建您的功能。

注意措辞,countBy 好像 Ramda 想要被告知如何计数。但没有什么能阻止您建立自己的计数。

const count = R.countBy(R.identity);

console.log(count(list))