0

String または [Int] のいずれかの入力として 2 種類の変数を取得できる関数を作成する必要があります。

これが私の作品です。リストのリストを引数として取り、すべてのリストの長さが同じかどうかをチェックします。はいの場合、(m,n) が表示されます。ここで、m はリストに含まれるリストの数、n はすべてのリストの長さです (これは同じです)。

size :: [[Int]] -> (Int,Int)
size a = size2 a m n
  where
  m = 0
  n = length (head a)

size2 :: [[Int]] -> Int -> Int -> (Int,Int)
size2 [] m n = (m,n)
size2 a m n
    |  n == length (head a) = size2 (tail a) (m+1) n
    |  otherwise = (0,0)

[[Int]] で動作するようにしましたが、[String] 入力でも動作しないに違いありません。

4

3 に答える 3

3

答えは、型シグネチャを次のように変更することです。

size :: [[a]] -> (Int,Int)size2 :: [[a]] -> Int -> Int -> (Int,Int)

しかし、この関数を作成するためのより良い方法もあります。自分でリストを調べる代わりにsize2Prelude

それを行う方法の良い例は次のとおりです。

size :: [[a]] -> (Int, Int)
size [] = (0,0)
size ls@(x:xs) = 
    if all (\s -> length x == length s) xs 
        then (length ls, length x) 
        else (0,0)

つまり、すべてのリストが最初のリストと同じサイズの場合は を返しtuple、そうでない場合は を返します。(0,0)

これは機能しますが、空のリストと、すべてのリストが同じサイズではないリストとをどのように区別するのでしょうか? を使用しておりますMaybe

size :: [[a]] -> Maybe (Int, Int)
size [] = Just (0,0)
size ls@(x:xs) = 
    if all (\s -> length x == length s) xs 
        then Just (length ls, length x) 
        else Nothing

*Main> size []
Just (0,0)
*Main> size ["gola","asda"]
Just (2,4)
*Main> size ["gola","asda","s"]
Nothing
于 2013-11-14T19:23:29.947 に答える
1

の型シグネチャは であるsize必要がありますsize :: [[a]] -> (Int, Int)aこれは型変数で、任意の型にすることができます。

文字のリストと同じように、との両方[[Int]] -> (Int, Int)を一般化したものです。[String] -> (Int, Int)String[Char]

もちろん、それにsize2応じてタイプを変更する必要があります。

補足として、定義を戻り値の型に変更することをお勧めします。これにより、さまざまなケースをMaybe (Int, Int)区別できます。[][[1],[2,3]]

于 2013-11-14T19:09:18.017 に答える