2

学校への宿題に少し問題があります。リストのリストで任意の x (int または文字) を見つけるコードを作成する必要があります。

私はこのようなものを持っています:

 find x xxs = [ [ x | x <- xs, x `elem` xs ] | xs <- xxs ]

Hugs98 は例外なくそれを受け入れますが、機能しません。

Input: find 2 [[1,1,1,1],[4,4,4,4],[3,3,3]]
Output: [[1,1,1,1],[4,4,4,4],[3,3,3,3]] 
4

1 に答える 1

5

少し名前を変更して、これを書いたと思います:

find x yss = [ [ y | y <- ys, y `elem` ys ] | ys <- yss ]

それはあなたが意図したことではないと思います。(コードには、 という名前の 2 つの変数がxあり、一方が他方を隠しています。)

あなたの質問には、使用が許可されているツールと許可されていないツールは記載されていません。

リスト内のものを明らかelemに見つけます。Bool「検索」とは、対象のアイテムが存在するかどうかを示す値を返すことを意味します。しかし、リストのリストをどのように処理するのでしょうか?

リスト内包表記は常にリストを返すため、findを返すことを望んでいた場合Bool、リスト内包表記は必要ありません。

を使用mapして、リストのリスト内のすべてのリストに適用できelemますが、s のリストが作成されましたBool。それに対処するには2つの方法があります。やや不器用な方法の 1 つは、 を使用elemして、リストにTrueどこかに含まれているかどうかを確認することです。しかし、より健全な方法は、組み込みor関数を使用することです。この関数は、s のリストの論理 OR を取りますBool。(対応する機能もありandます。)

find x yss = or (map (x `elem`) yss)

これを行う別の方法もあります。と呼ばれる組み込み関数があります。anyこれは、関数をもののリストに適用し、True提供された関数が を返す場合に返しますTrue。だからあなたはすることができます

find x yss = any (x `elem`) yss
于 2013-03-06T08:53:54.427 に答える