我正在编写来自Programming Elixir(PragProg)的示例问题。问题是编写一个函数,将数字from
返回到to
。我的解决方案如下。但是,有时它们会返回字符(相当于它们的ascii)。如何避免这种情况并仅返回数字。
defmodule MyList do
def span(), do: []
def span(from), do: [from]
def span(from, to) when from == to, do: [from]
def span(from, to) when from > to, do: [from] ++ span(from - 1, to)
def span(from, to) when from < to, do: [from] ++ span(from + 1, to)
end
MyList.span(31,34) #=> [31,32,33,34]
MyList.span(-5,-8) #=> [-5,-6,-7,-8]
MyList.span(65,68) #=> 'ABCD' (I need a list with numbers 65 to 68)
答案 0 :(得分:2)
你无法阻止,因为Elixir和Erlang没有用户定义的类型,所以没有办法区分列表和单个带引号的字符串,因为两者都只是列表。你真的应该没有太大的问题。
如果它打印,那么你可以做这样的事情
IO.inspect [65, 66, 67, 68], char_lists: false#[65, 66, 67, 68]
有关原因的详细解释,请转到此帖子 - https://stackoverflow.com/a/30039460/3480449
要在您的模块中添加它,打印结果,您需要其他方法,并将其他方法设为私有
defmodule MyList do
def span(), do: IO.inspect [], char_lists: false
def span(from), do: IO.inspect [from], char_lists: false
def span(from, to), do: IO.inspect span_h(from, to), char_lists: false
defp span_h(from, to) when from == to, do: [from]
defp span_h(from, to) when from > to, do: [from] ++ span(from - 1, to)
defp span_h(from, to) when from < to, do: [from] ++ span(from + 1, to)
end