所以你基本上想要的是一種將非列表包裝到單個元素列表中的方法,然後您的for
將按照預期的方式使用char或charlists作爲參數。你可以用List.wrap/1
做到這一點:
cross2 = fn as, bs ->
for a <- List.wrap(as), b <- List.wrap(bs), do: [a, b]
end
測試:
cross = fn
a, b when is_list(a) and is_list(b) -> for x <- a, y <- b, do: [x, y]
a, b when not is_list(a) and is_list(b) -> for y <- b, do: [a, y]
a, b when is_list(a) and not is_list(b) -> for x <- a , do: [x, b]
end
cross2 = fn as, bs ->
for a <- List.wrap(as), b <- List.wrap(bs), do: [a, b]
end
IO.inspect cross.('abc', 'def')
IO.inspect cross2.('abc', 'def')
IO.inspect cross.(?a, 'def')
IO.inspect cross2.(?a, 'def')
IO.inspect cross.('abc', ?d)
IO.inspect cross2.('abc', ?d)
# Your implementation doesn't handle this case.
# IO.inspect cross.(?a, ?d)
IO.inspect cross2.(?a, ?d)
輸出:
['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf']
['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf']
['ad', 'ae', 'af']
['ad', 'ae', 'af']
['ad', 'bd', 'cd']
['ad', 'bd', 'cd']
['ad']
有一件事:你需要執行'x :: utf8'和'y :: utf8'來獲得與非ASCII輸入的charlists相同的行爲。 – Dogbert
@Dogbert確實,謝謝,更新。 – mudasobwa