リストで構成されるリストを入力として持つ関数を Haskell で作成しようとしましたが (かなり単純に聞こえるかもしれません)、入力が (m,n) 次元の正しいテーブルであるかどうかをこの関数で確認したいと考えています。 . そうでない場合は、 を返し(0,0)
ます。たとえば、次のように入力した場合:
[[1,7,2,1],[2,2,7,8],[3,2,0,1]]
私は得るでしょう:
(3,4)
プログラムで無効な入力を拒否するには、この関数が必要です。
まず、実際の質問に答えるため(0, 0)
に、例外的な結果として使用しないでください。関数の型は次のようにする必要があります。
matrixDim :: [[a]] -> Maybe (Int, Int)
行列が無効な場合、結果は になりますNothing
。まず、最初のサブリストの長さを確認します。行列には少なくとも 1 つの行と 1 つの列が必要であると想定しています。
matrixDim [] = Nothing
Maybe
これで、モナドであるという事実を使用できます。
matrixDim (xs:xss) = do
let w = length xs
guard (w > 0)
(w', h) <- matrixDim xss <|> return (w, 0)
guard (w == w')
return (w, h + 1)
それでは、実際の問題に戻りましょう。リストのリストは、あなたが望んでいるものではありません。この種のアプリケーションに適したデータ型は、Data.Array.*
モジュールの 1 つで定義されている配列です。並列化を無料で利用できる、より実験的な代替手段は、repaを使用することです。
dim :: [[a]] -> (Int, Int)
dim ls = let x = length ls
ys = map length ls
in case ys of
h:t -> if all (==h) t then (x, h) else (0, 0)
[] -> (0, 0)