我希望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
但这与规格不符:(。你能帮帮我吗?
答案 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/2和List.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