所以我正在尝试学习 Elixir(我有 F# 和 Haskell 的背景),但我很难理解我的代码中发生了什么:
fizz_buzz = fn
(0, 0, _) -> "FizzBuzz"
(0, _, _) -> "Fizz"
(_, 0, _) -> "Buzz"
(_, _, c) -> c
end
fizz_buzz_rem = fn n -> fizz_buzz.(rem(n, 3), rem(n, 5), n) end
# This works
IO.puts(fizz_buzz_rem.(10))
IO.puts(fizz_buzz_rem.(11))
IO.puts(fizz_buzz_rem.(12))
IO.puts(fizz_buzz_rem.(13))
IO.puts(fizz_buzz_rem.(14))
IO.puts(fizz_buzz_rem.(15))
IO.puts(fizz_buzz_rem.(16))
IO.puts(fizz_buzz_rem.(17))
IO.puts("----------------")
inputs =
10..17
|> Enum.to_list
# Doesn't work
inputs
|> Enum.map(fizz_buzz_rem)
|> IO.puts
IO.puts("----------------")
# Doesn't work
inputs
|> Enum.map(fn n -> fizz_buzz.(rem(n, 3), rem(n, 5), n) end)
|> IO.puts
IO.puts("----------------")
manual_inputs = [10, 11, 12, 13, 14, 15, 16, 17]
# Doesn't work
manual_inputs
|> Enum.map(fizz_buzz_rem)
|> IO.puts
IO.puts("----------------")
# Doesn't work
manual_inputs
|> Enum.map(fn n -> fizz_buzz.(rem(n, 3), rem(n, 5), n) end)
|> IO.puts
IO.puts("----------------")
# The idiotic way (that doesn't work)
result = [
fizz_buzz_rem.(10),
fizz_buzz_rem.(11),
fizz_buzz_rem.(12),
fizz_buzz_rem.(13),
fizz_buzz_rem.(14),
fizz_buzz_rem.(15),
fizz_buzz_rem.(16),
fizz_buzz_rem.(17),
]
IO.puts result
# ???????????
当我运行 elixir ex_02.exs
时,输出是:
Buzz
FizzBuzz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
----------------
Buzz
FizzBuzz
----------------
Buzz
FizzBuzz
----------------
Buzz
FizzBuzz
----------------
Buzz
FizzBuzz
因此,正如您所看到的,当我将匿名函数分别应用于每个值时,我得到了正确的答案,但是当我尝试使用范围、映射甚至手动将函数应用于列表的每个元素时,我最终得到了错误的答案结果。
关于将匿名函数应用于 elixir 中的列表,我有什么错误?
最佳答案
如果你使用 IO.inspect
而不是 IO.puts
,你可以看到发生了什么:
["Buzz", 11, "Fizz", 13, 14, "FizzBuzz", 16, 17]
您的 fizzbuzz 函数返回字符串或整数,具体取决于输入。 IO.puts
根据整数是否在列表中以不同方式处理整数:
iex(1)> IO.puts(65)
65
:ok
iex(2)> IO.puts([65])
A
:ok
因此在您的代码中,IO.puts
实际上打印了与整数 11、13、14、16 和 17 对应的控制代码。在我的终端中它显示为:
Buzz^KFizz^M^NFizzBuzz^P^Q
你可以通过让你的函数总是返回字符串来解决这个问题:
fizz_buzz = fn
(0, 0, _) -> "FizzBuzz"
(0, _, _) -> "Fizz"
(_, 0, _) -> "Buzz"
(_, _, c) -> "#{c}"
end
关于functional-programming - 为什么我不能将匿名函数应用于列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66120607/