2

再び私:)

タイトルで述べたように、(int の) リストのリストから特定の int を検索する方法を探しています。これはより大きな問題の一部ですが、この文脈で説明しやすくするために単純化しました。

この例では、int のリストのリストを検索して、1 番を探しています。ナンバーワンを見つけた回数を合計したい。以下の例では、結果は 3 になります。

これが私がこれまでに持っているものです:

a = [1,2,3]
b = [1,17,12]
c= [201,16,1]
d = [234,235,123]

y =[a,b,c,d]

getOne :: [[Int]]->Int
getOne List' = total
    where 
        checkNumber x = x==1
            checkList = filter CheckNumber List'
            total = sum checkList

リストが1に等しいかどうかを確認できないため、これを実行できないことはわかっていますが、リスト内のリストを確認するにはどうすればよいですか

4

4 に答える 4

8

リストのリストを平坦化し、これを解決方法が既にわかっている問題に減らします。1基本的に、リストのリストを調べているという事実は、答えを変えるものではありません。構造内の s の数を気にするだけです。

hoogleを使用してリストを平坦化する関数を見つけることができます。そのような関数のタイプを入力するだけで、結果が得られます。これは、Haskell API を学習するための非常に便利なツールです。今が使い始める良い機会です。

再帰を使用してフラット化関数を自分で実装することも良い考えです。getOneこれを行うと、関数を直接記述する方法についての洞察も得られます。それは良い学習運動です。

于 2013-10-05T00:01:11.647 に答える
1

平坦化せずに、次のようなことを試すことができます。

Prelude> let y = [[1,1,2] , [4], [5,6,1]]
Prelude> sum [length $ filter (==1) yl | yl <- y]
3

または使用Applicative

Prelude> import Control.Applicative
Prelude Control.Applicative> sum $ length <$> filter (==1) <$> y
于 2013-10-05T07:11:33.603 に答える