2

Haskellプロジェクトに取り組んでいると、次の関数を書くことになりました

reGrid :: [[[a]]] -> [[a]]
reGrid [] = []
reGrid xs | any null xs = []
          | otherwise = (concat $ map head xs) : reGrid (map tail xs)

Haskell を話せない人のために説明すると、これは行列のリストを取り、対応する行を新しい行列に結合します。

このプロジェクトで何度かポップアップしましたが、これは私が見逃したある種の一般的な操作であると感じています。

この操作の標準名はありますか? Hoogle で検索中

[[[a]]] -> [[a]

何も役に立ちません。

4

2 に答える 2

2

たくさんのものがあり、それらを 1 つにまとめたいと考えています。これを行う通常の方法は、ある種の折り目を使用することです。それでは、それから始めましょう:

regrid [] = []
regrid xs = foldr go (repeat []) xs

ここで、1 つの行列があり、残りを再グリッド化した結果もあるとします。それらをどのように組み合わせることができますか?さて、行がなくなるまで行をマージしたいのですが、これは の仕事のように聞こえzipWithます。ですから、すべてをまとめると、

regrid = foldr (zipWith (++)) []

これは標準関数の 1 つではありませんが、短く、部分関数をいじることはありません。ただし、リストが長い場合は効率の問題があります。これを修正するには、左折りに切り替えることができますが、厳密性を正しくするのは難しいでしょう。私はそれを後で書くことができます。

于 2015-09-29T18:49:28.213 に答える