微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在另一个枚举中的枚举中声明管道列表?

如何解决如何在另一个枚举中的枚举中声明管道列表?

我正在尝试在另一个 Enum 内的 Enum 中使用管道列表。为了让自己更清楚一点,下面是我的代码

  def word_count(str) do
    String.downcase(str)
    |> String.split
    |> Enum.map(fn x -> Enum.count(LIST HERE,x) end)
  end

所以我想做的是使用管道列表作为 Enum.count 中的参数

解决方法

如果您使用足够现代的 (应该如此),then/2 就是您的朋友。

"Foo bar foo"
|> String.downcase()
|> String.split()
|> then(&Enum.map(&1,fn x -> Enum.count(&1,fn y -> y == x end) end))
#⇒ [2,1,2]

最易读的解决方案仍然是

words =
  "Foo bar foo"
  |> String.downcase()
  |> String.split()

Enum.map(words,&Enum.count(words,fn x -> x == &1 end))

尽管可读性强,但不应尝试保留单个管道。

,

Enum 函数将一个可枚举作为它们的第一个参数,因此您可以简单地将一个列表导入它们。

如果要计算每个单词出现的次数,可以使用Enum.frequencies/1

def word_count(str) do
  str
  |> String.downcase()
  |> String.split()
  |> Enum.frequencies()
end

示例:

iex> Example.word_count("foo bar baz")                            
%{"bar" => 1,"baz" => 1,"foo" => 1}

在这种情况下,Enum.frequencies/1 很有帮助,但通常您可以使用 Enum.reduce/3 来编写自己的逻辑。此处将 Enum.frequencies/1 替换为 Enum.reduce/3,执行相同的操作:

def word_count(str) do
  str
  |> String.downcase()
  |> String.split()
  |> Enum.reduce(%{},fn word,acc ->
    Map.update(acc,word,fn count -> count + 1 end)
  end)
end

为了回应评论,使用 Kernel.then/1,并免责声明可能有更好的方法来做到这一点,具体取决于所需的内容(如上面的 reduce,或使用推导式):>

1..10
|> then(fn one_to_ten ->
  Enum.map(one_to_ten,fn x ->
    Enum.map(one_to_ten,fn y ->
      {x,y}
    end)
  end)
end)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。