【发布时间】:2020-10-05 07:10:06
【问题描述】:
我正在学习函数式编程课程,并且来自 OOP,我试图解决一些我认为非常微不足道的问题,但我只是不理解这里的概念。这是我需要为学校做的练习
给定一个短语,在我的例子中是
“使用 Elixir 进行模式匹配。记住等号是匹配运算符,而不是赋值”
我需要检查每个单词的起始字母是否有匹配的模式,并根据模式应用特定的修改。
我什至不完全确定我当前的代码正在生成什么,当我检查 x 和 y 时,我有点理解循环在做什么,它们有一个短语的每个单词的列表,并且该内部列表包含对每个单词的检查字母,如果不是以该字母开头,则为 nil,如果是,则为修饰词。
我的 OOP 希望这些循环不返回任何“nil”,并且在每次迭代中只返回一个编辑过的单词。在函数式编程中,我不能打破循环并强制返回,所以我需要以另一种方式考虑这一点。
我的问题是我应该如何从函数式编程的角度来解决这个问题? 一开始我得到一个组成短语的单词列表,然后我希望编辑每个单词,最后再次获得一个包含这些编辑单词的列表。 也许关于如何解决这个问题的类似伪代码的结构可以帮助我理解基本概念。
这是我当前的代码:
#Task two
def taskTwo() do
IO.puts "Task Two"
IO.puts "Pattern Matching with Elixir. Remember that equals sign is a match operator, not an assignment"
IO.puts "Task Two\n...Editing Words ..."
phrase = String.downcase("Pattern Matching with Elixir. Remember that equals sign is a match operator, not an assignment") |> String.split()
x = for word <- phrase do
checkVowels(word)
end
y = for word <- phrase do
checkConsonants(word)
end
IO.inspect x
IO.inspect y
end
#check vowels
def checkVowels(word) do
vowels = ["a","e","i","o","u"]
for vowel <- vowels do
if String.starts_with?(word, vowel) do
word <> "ay "
end
end
end
#check consonants
def checkConsonants(word) do
consonants = ["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","z","y"]
for consonant <- consonants do
if String.starts_with?(word, consonant) do
edited = String.replace_prefix(word, consonant, "")
edited <> consonant <> "ay "
end
end
end
我需要申请的修改:首先检查起始字母并应用修改,然后再次检查内部单词是否有任何多字母组合
Words beginning with consonants should have the consonant moved to the end of the word, followed by "ay".
Words beginning with vowels (aeiou) should have "ay" added to the end of the word.
Some groups of letters are treated like consonants, including "ch", "qu", "squ", "th", "thr", and "sch".
Some groups are treated like vowels, including "yt" and "xr".
【问题讨论】:
-
“我需要检查每个单词的起始字母是否匹配模式,并根据模式应用特定的修改。”模式是什么?您需要应用哪些修改?
-
@AdamMillerchip 我编辑了原帖,最后是要求。首先我需要检查起始字母并进行修改。这将对每个单词进行,但在第一次修改后,我需要再次检查单词是否包含任何多字母组合,然后也要这样做。
-
“我不能打破循环”是的,这就是为什么通常在 FP 中你不使用它们的众多原因之一。我不知道长生不老药提出替代方案,但如果不存在,我会感到震惊。同样,我不知道长生不老药,但是您发布的代码看起来纯粹是程序性的,几乎没有任何功能。据我所知,您可以将这几乎一行一行地翻译成 Python。你确定这是你应该如何解决这个问题吗?
-
@JaredSmith 你是对的!到目前为止,我们做了几节课,在这个作业之前,我们介绍了模式匹配,我们工作的那些例子基本上都和 Elixir 入门指南中的一样。然后我们得到了任务,但我仍然坚持 OOP,我不明白我应该如何处理 FP。我在这里缺少一些基本概念或想法。
-
部分混淆可能是由于 for/if 语法:
for实际上更像是伪装的Enum.map/2。因此它将返回一个列表,其中包含与原始可枚举一样多的元素(除非您进行过滤)。同样,if总是会返回一个值,如果你没有else,它将是nil。我强烈建议您熟悉Enum模块,它应该为您提供替换典型“循环”所需的几乎所有东西。在你的情况下,我认为Enum.find/2是你正在寻找的。span>
标签: functional-programming elixir