並列リスト内包表記
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/04/19 04:51 UTC 版)
「リスト内包表記」の記事における「並列リスト内包表記」の解説
Glasgow Haskell Compilerには、リスト内包表記の構文において複数の独立した修飾子 (qualifier) の分割を許可する、並列リスト内包表記(あるいはzip-comprehension)と呼ばれる拡張構文が存在する。カンマで区切られた変数は依存関係にある(すなわち、ネストされる)が、パイプ文字で区切られた修飾子は並列に評価される(マルチスレッドで動作するという意味でなく、単に修飾子がzipされるという意味である)。 -- 通常のリスト内包表記a = [(x,y) | x <- [1..5], y <- [3..5]]-- [(1,3),(1,4),(1,5),(2,3),(2,4) ...-- zipによるリスト内包表記b = [(x,y) | (x,y) <- zip [1..5] [3..5]]-- [(1,3),(2,4),(3,5)]-- 並列リスト内包表記c = [(x,y) | x <- [1..5] | y <- [3..5]]-- [(1,3),(2,4),(3,5)] Racketの標準ライブラリには、「for」と「for*」いう2つのキーワードで区別される、並列バージョンと多重ループバージョンの2つの内包表記が含まれている。例えば、ベクトル内包表記「for/vector」および「for*/vector」は、入力シーケンスに対してそれぞれ並列および多重ループによってベクトルを作成する。以下は、上のHaskellのリスト内包表記の例をRacketコードに書き下したものである。 > (for*/list ([x (in-range 1 6)] [y (in-range 3 6)]) (list x y))'((1 3) (1 4) (1 5) (2 3) (2 4) (2 5) (3 3) (3 4) (3 5) (4 3) (4 4) (4 5) (5 3) (5 4) (5 5))> (for/list ([x (in-range 1 6)] [y (in-range 3 6)]) (list x y))'((1 3) (2 4) (3 5)) また、Pythonでは次のように書ける。 # 通常のリスト内包表記>>> a = [(x, y) for x in range(1, 6) for y in range(3, 6)][(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), ...# 並列 (zipによる) 内包表記>>> b = [x for x in zip(range(1, 6), range(3, 6))][(1, 3), (2, 4), (3, 5)]
※この「並列リスト内包表記」の解説は、「リスト内包表記」の解説の一部です。
「並列リスト内包表記」を含む「リスト内包表記」の記事については、「リスト内包表記」の概要を参照ください。
- 並列リスト内包表記のページへのリンク