Elixir:生成给定参数的'n`次出现列表(类似于Haskell的复制)

Mar*_*iro 8 haskell list elixir

我想要一个Elixir函数来生成一个n参数出现列表,类似于Haskell的replicate函数:

Input: replicate 3 5

Output: [5,5,5]

Input: replicate 5 "aa"

Output: ["aa","aa","aa","aa","aa"]

Input: replicate 5 'a'

Output: "aaaaa"
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个"复制"整数n时间的函数:

import String

def replicate(number, n)
  String.duplicate(to_string(number), n) 
  |> split("", trim: true) 
  |> Enum.map(fn n -> String.to_integer(n) end
end
Run Code Online (Sandbox Code Playgroud)

但这与规格不符:(.你能帮帮我吗?

raa*_*cer 10

def replicate(n, x), do: for _ <- 1..n, do: x
Run Code Online (Sandbox Code Playgroud)

如果您希望最后一个案例返回字符串,那么您应该使用guard添加此类型的定义,如下所示:

def replicate(n, [x]) when is_integer(x), do: to_string(for _ <- 1..n, do: x)
def replicate(n, x), do: for _ <- 1..n, do: x

iex(1)> replicate 3, 5
[5, 5, 5]
iex(2)> replicate 3, 'a'
"aaa"
Run Code Online (Sandbox Code Playgroud)

您还可以使用String.duplicate/2List.duplicate/2作为其他建议:

def replicate(n, x = [c]) when is_integer(c), do: String.duplicate(to_string(x), n)
def replicate(n, x), do: List.duplicate(x, n)
Run Code Online (Sandbox Code Playgroud)

另请注意,Char列表'a'和字符串在Elixir中"a"不同的东西,因此请确保您正确理解这一点.

最后,如果这不是一个家庭任务,那么我建议不要重新发明自行车,但如果可能的话,直接使用String和List模块中的函数.