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

时间:2016-12-27 19:58:43

标签: list haskell elixir

我希望Elixir函数生成@SEARCHBY个参数出现的列表,类似于Haskell's replicate函数:

n

我已经创建了一个“复制”整数Input: replicate 3 5 Output: [5,5,5] Input: replicate 5 "aa" Output: ["aa","aa","aa","aa","aa"] Input: replicate 5 'a' Output: "aaaaa" 次的函数:

n

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

2 个答案:

答案 0 :(得分:9)

def replicate(n, x), do: for _ <- 1..n, do: x

如果您希望最后一个案例返回字符串,那么您应该使用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"

您还可以使用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)

另请注意,Elixir中的Char列表'a'和字符串"a"different things,因此请确保您正确理解。

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

答案 1 :(得分:0)

以先前的答案为基础,但避免了copy(0,:foo)错误。

def copy(n,x),do:for i <-0..n,i> 0,do:x