したがって、本質的に必要なのは、非リストを1つの要素リストにラップする方法です。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