loops - 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', 'G', 'A', 'C']
正如我们可能看到的,在这两种情况下,我们都需要访问 map 中的元素,map[[c]]
结果是一个列表列表,这是因为'A'
它本身就是一个列表,只有一个元素?A == 65
。
[65] == 'A'
#⇒ true
为了解决这个问题,我们可以从更合适的映射器开始,将字符映射到字符而不是字符列表。
map = %{?A => ?U, ?C => ?G, ?T => ?A, ?G => ?C}
for c <- 'ACTG', do: map[c]
#⇒ 'UGAC'
推荐阅读
- apache - 来自 apache 的 301 重定向 - 可以保留标头吗?
- python - Python Selenium - 来自 href 链接的来源
- azure - 使用 privatendpoint 创建 SQL 数据库的 ARM 模板
- c# - PuppeteerSharp - querySelectorAll + 点击
- python - geojson 正确的文件路径
- angular - 将值从输入组件传递到 Angular 应用程序中的按钮组件
- typescript - 返回类型 void 和上下文类型
- python - 如何选择性地将样式应用于特定列的行?
- vb.net - 将数据表中的列添加到数据库
- python - 通过类传递变量并在 Tkinter 中使用 .get() 来查找用户输入