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

Elixir 中的条件循环

如何解决Elixir 中的条件循环

我已经开始学习 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

解决方法

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

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','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'

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