2017-09-12 5 views
0

私はそれが非常に醜いものが、おやっを行いcharlistsや文字の外積ですか?

iex(87)> cross=fn               
...(87)> a, b when is_list(a) and is_list(b) -> for x <- a, y <- b, do: [x,y] 
...(87)> a, b when not is_list(a) and is_list(b) -> for y<-b, do: [a,y]  
...(87)> a, b when is_list(a) and not is_list(b) -> for x<- a , do: [x, b] 
...(87)> end 

を書きました。私ははるかにシンプルにしようとしました

cross=fn(a,b) -> for x <- to_charlist(a), y <- to_charlist(b), do: [x,y] end 

しかし、これは1文字で送信すると多くの偽の結果になりました。

答えて

0

したがって、本質的に必要なのは、非リストを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'] 
0

別のアプローチは、Kernel.to_string/1を使用することを効果的参加平らリスト、および<<c <- string>>発電機のようになります。

cross3 = fn a, b ->        
    [a, b] = Enum.map([a, b], &Kernel.to_string([&1])) 
    for <<x::utf8 <- a>>, <<y::utf8 <- b>>, do: [x, y]    
end 

IO.inspect cross3.('abc', 'def') 
#⇒ ['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf'] 
IO.inspect cross3.(?a, 'def') 
#⇒ ['ad', 'ae', 'af'] 
IO.inspect cross3.('abc', ?d) 
#⇒ ['ad', 'bd', 'cd'] 
IO.inspect cross3.(?a, ?d) 
#⇒ ['ad'] 
+0

一つのこと: 'x :: utf8'と' y :: utf8'を使って、非ASCII入力のためのcharlistsと同じ振る舞いをしたいでしょう。 – Dogbert

+0

@Dogbert確かに、ありがとう、更新されました。 – mudasobwa

関連する問題