0

リストで構成されるリストを入力として持つ関数を Haskell で作成しようとしましたが (かなり単純に聞こえるかもしれません)、入力が (m,n) 次元の正しいテーブルであるかどうかをこの関数で確認したいと考えています。 . そうでない場合は、 を返し(0,0)ます。たとえば、次のように入力した場合:

[[1,7,2,1],[2,2,7,8],[3,2,0,1]]

私は得るでしょう:

(3,4)

プログラムで無効な入力を拒否するには、この関数が必要です。

4

2 に答える 2

6

まず、実際の質問に答えるため(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を使用することです。

于 2012-11-15T06:03:05.210 に答える
0
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)
于 2012-11-15T06:02:16.757 に答える