2

重複の可能性:
デカルト積

私は Haskell の初心者で、問題があります。リストの最初の要素を取得し、2 番目のリストのすべての要素に接続する関数を実行した後、最初のリストから 2 番目の要素を取得して同じことを行います。たとえば、[[1]、[2]、[3]) と [[4]、[5]、[6]] を取り、出力を取得したい

[([1],[4]),([1],[5]),([1],[6]),
([2],[4]),([2],[5]),([2],[6]),
([3],[4]),([3],[5]),([3],[6])]

私が見つけたものは転置です

transpose [[1,2,3],[4,5,6]]
[[1,4],[2,5],[3,6]]

助けていただければ幸いです。

編集:恥ずかしい。解決策を見つけました

[[x,y] | x <- [[1],[2],[3]], y <- [[4],[5],[6]]]

結果は次のとおりです。

[[[1],[4]],[[1],[5]],[[1],[6]],[[2],[4]],[[2],[5]],[[2],[6]],[[3],[4]],[[3],[5]],[[3],[6]]]
4

3 に答える 3

4
import Control.Applicative

(,) <$> [[1],[2],[3]] <*> [[4],[5],[6]]

--[([1],[4]),([1],[5]),([1],[6]),([2],[4]),([2],[5]),([2],[6]),([3],[4]),([3],[5]),([3],[6])]

説明については、 http://learnyouahaskell.com/functors-applicative-functors-and-monoids#applicative-functorsを参照してください。

リストは だけApplicativeでなくMonadsであるため、do-Notation を使用することもできます。

do x<-[[1],[2],[3]]; y<-[[4],[5],[6]]; return (x,y)

--[([1],[4]),([1],[5]),([1],[6]),([2],[4]),([2],[5]),([2],[6]),([3],[4]),([3],[5]),([3],[6])]
于 2011-06-19T13:23:36.770 に答える
1

これは面白い。

sequence [[[1],[2],[3]] , [[4],[5],[6]]]
于 2011-06-19T16:44:34.410 に答える
1

私はhaskellも初めてです。これがあなたの質問に対する私の解決策です。役に立てば幸いです:

f [] _ = []
f (x:xs) ys = zip (take (length ys) (repeat x)) ys ++ f xs ys 

コードはそれ自体を非常に簡単に説明していると思います:)

于 2011-06-19T12:58:16.890 に答える