2

タプルのリストがあり、その要素を使用してネストされたリストの要素に到達しようとしています。

list = [["c","a","b"],["k","l","m"]]
indexTuple = [(0,1),(1,1),(1,2)]

このようにして、indexTupleの要素に対応するリストの要素の1つに「a」があるかどうかを確認する必要があります。これまでの私の試み。

seekinga :: [[[Char]]] -> Int -> Int -> Int -> [(Int,Int)]
seekinga list x y width 
        | list !!(map fst indexTuple) !!(map snd indexTuple) == "a" = [(fst indexTuple,snd indexTuple)]
        | otherwise = [()]
    where indexTuple = [(x,y) | x <- [x-width..x+width], y <- [y-width..y+width]] 

これは明らかに機能しません。演算子は整数が機能することを望んでいますが、mapはリストを返します。どんな提案でも大歓迎です。

4

2 に答える 2

6

実際には、2 つの別個の懸念があります。2 つの数値が与えられた場合、ネスト リストにどのようにインデックスを付けるか、およびタプルから 2 つの数値を取得する方法です。

最初の問題は、型を見るだけで簡単に解決できます。1 つのリストにインデックスを付ける方法を知っています: (!!) :: [a] -> Int -> a. ここでは、ネストされたリストを含め、何でもかまいaません。したがって、 が与えられると、 を使用して を取得できます。そして、これはリストそのものなので、再びを使用して を取得できます。(あなたが気付いていない場合に備えて、ただです。)[[[Char]]]!![[Char]]!! [Char][Char]String

したがって、ここで行う必要があるのは!!、それを使用して、最初の結果に対して再度使用することだけです。

では、実際に 2 つの数値を取得するにはどうすればよいでしょうか。ここで、パターン マッチングを使用します。let ステートメントを使用してタプルと照合するだけです。

let (i, j) = tuple in ...

2つを組み合わせるだけで準備完了です。

于 2013-03-19T22:29:08.033 に答える
3

したがって、要素を次のように表示できます。

> list !! 1 !! 2
"m"

それでは、これを関数にしましょう:

:set -XNoMonomorphismRestriction
> let index lst  i j= lst !! i !! j

そしてfilter、「a」を指していないインデックスを除外します

> filter (\(i, j) -> index list i j == "a") indexTuple
[(0,1)]

代わりに list = [["c","a","b"],["k","l","a"]] の場合

それから

> filter (\(i, j) -> index list i j == "a") indexTuple
[(0,1),(1,2)]

を使用!!することは最善の選択肢ではないかもしれませんが、実際にはおそらくそうではありません。私が理解したように、問題の 2 つの部分を分解しようとしました。要素にアクセスし、インデックスをフィルター処理します。

于 2013-03-19T22:28:13.820 に答える