【问题标题】:Conditional Loop in ElixirElixir 中的条件循环
【发布时间】:2021-07-14 15:31:10
【问题描述】:

我已经开始研究 Elixir,但我正在努力实现从 OOP 的功能范式转变。

所以我正在做的练习要求我返回正确的字符串格式,将 DNA 转换为 RNA。

例如:RnaTranscription.to_rna('ACTG') 应该返回 'UGAC'

这是我目前所拥有的,但我不知道如何进行。 我应该如何获取每个元素并替换它们? 我考虑过对每一个都使用 String.replace(dna, "A", "U") 但它不是 DRY。

defmodule RnaTranscription do
  def to_rna(dna) do
    map = %{"A" => "U", "C" => "G", "T" => "A", "G" => "C"}
    dna
    |> String.split("")
    |> Enum.map(dna, substitute(dna, x))
  end

  def substitute(x), do: x -> [ map[x] | substitute(tails) ]

end

【问题讨论】:

  • 'ACTG' 是一个列表,而不是一个二进制字符串。

标签: loops dictionary foreach elixir phoenix


【解决方案1】:

首先,在 中,应该区分表示字符串的双引号和表示字符列表的单引号。后者实际上是一个列表,而不是一个字符串。

iex|1> is_list('ABCD')
#⇒ true

这个 exercism.io 示例已经对您有所帮助,因为它要求翻译 charlists。也就是说,可以在输入上使用Enum.map/2(或使用Kernel.SpecialForms.for/1理解。)

map = %{'A' => 'U', 'C' => 'G', 'T' => 'A', 'G' => 'C'}

Enum.map('ACTG', fn c -> map[[c]] end)
#⇒ ['U', 'G', 'A', 'C']

for c <- 'ACTG', do: map[[c]]
#⇒ ['U', 'G', 'A', 'C']

如我们所见,在这两种情况下,我们都需要以map[[c]] 访问映射中的元素,结果是一个列表列表,这是因为'A' 是一个单独的列表,只有一个元素?A == 65.

[65] == 'A'
#⇒ true

为了解决这个问题,我们可以从更合适的映射器开始,将字符映射到字符而不是字符列表。

map = %{?A => ?U, ?C => ?G, ?T => ?A, ?G => ?C}
for c <- 'ACTG', do: map[c]
#⇒ 'UGAC'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-24
    • 2021-03-19
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    相关资源
    最近更新 更多