-1

私はそのようなリストのリストを持っています:

[["BBBBBBBB",
  "BWFFFPFGB", 
  "BWFFFPFGB",
  "BWFFMPFGB",
  "BWFFFPF_B",
  "BWFFFPF6B",
  "BBBBBBB"]]

私は少し調査を行い、!!演算子を使用して個々の要素にアクセスする方法を見つけました。しかし、特定の要素を検索することになると、それを'M'どうやって行うのかわかりません。私の友人は私が (x:xs):xss リストのようなものを使う必要があると言いました、しかし私がWinGHCi haskellプログラムでこれを試みるとき、私はこれを手に入れます。

Prelude> let list =    [["BBBBBBBB",
  "BWFFFPFGB", 
  "BWFFFPFGB",
  "BWFFMPFGB",
  "BWFFFPF_B",
  "BWFFFPF6B",
  "BBBBBBB"]]


Prelude> head(x:xs):xss
<interactive>:192:2: Not in scope: `x'
<interactive>:192:4: Not in scope: `xs'
<interactive>:192:8: Not in scope: `xss'

list名前を宣言するのではなく宣言することは理解しています x:xsが、宣言しても x:xsエラーが発生します。私はおそらく、何をすべきかを本当に理解するためにhaskellに少し慣れていないので、この方法を間違って行っている可能性があります。

私はここを見てきましたHaskellの個々のリスト要素を置き換えますか?最終的には別のものに置き換えたいのですM が、それをどのように実装するのか完全にはわかりません。

どんな助け/ガイダンスもありがたいです、ありがとう!

4

2 に答える 2

2

Wまず、をに置き換える方法を見てみましょうM

charWM :: Char -> Char
charWM 'W' = 'M'  -- If you see W, put M.
charWM x  =  x   -- If you see anything else, put it back as is.

他の文字変換を追加することで、その関数を好きなように書き直すことができます。

それでは、リスト上でそれを機能させましょう。map :: (a ->b) -> [a] -> [b]リストのすべての要素に関数を適用できる優れた関数があります。

stringWM :: String -> String
stringWM xs = map charWM xs  -- do charWM to everything in xs.

stringWM "QWERTY WILL WIN"="QMERTY MILL MIN"

次に、リストのリストに対してそれを行うことができます。

lolWM :: [String] -> [String]
lolWM xss = map stringWM xss

(はのStringタイプの同義語です[Char]。)
ghciでテストしてみましょう。

*Main> list'
["BBBBBBBB","BWFFFPFGB","BWFFFPFGB","BWFFMPFGB","BWFFFPF_B","BWFFFPF6B","BBBBBBB"]
*Main> lolWM list'
["BBBBBBBB","BMFFFPFGB","BMFFFPFGB","BMFFMPFGB","BMFFFPF_B","BMFFFPF6B","BBBBBBB"]

すべて良い。

あなたの例は正確ではありませんでしたlist'、それ[list']は1つの要素を持っているので、それに取り組むために私たちはする必要がありmap lolWMます。必要な場合は、わざわざ書いstringWMたりlolWM、リストのリストのリストに直接移動したりしないことがよくあります。

lololWM = (map.map.map) charWM

map.map.mapマップのマップをマップすることを意味します。あなたはそれが少しあなたの心を吹き飛ばすのを許すことができます、あるいはあなたはただCharのリストのリストのリストを言うことができます、それでマップマップマップ-リストレベルごとに1つのマップ。


W将来的には、文字ではなく文字列に置き換えたいと思うかもしれません。

rewriteChar :: Char -> String
rewriteChar 'W' = "--^--"
rewriteChar  x  = [x] -- put x in a list to make it a string

今回は、地図だけでは不十分ですmap rewriteChar "QWERTY WILL WIN"

["Q","--^--","E","R","T","Y"," ","--^--","I","L","L"," ","--^--","I","N"]

これを使用concatして1つのリストにまとめることもできますが、もっと楽しいです

rewriteString = concatMap rewriteChar

だから今rewriteString "QWERTY WILL WIN"私たちに与え"Q--^--ERTY --^--ILL --^--IN"ます。

もっと驚くべきことを試すには"QWERTY WILL WIN" >>= rewriteChar"Hello Mum" >>= \x -> [x,x,x]

于 2012-11-09T00:36:56.200 に答える
2

まず第一に、Haskellの事実上すべての「変数」は不変であるため、「リストの変更」はなく、変更されたコピーがあります。

次に、いくつかの基準で要素を見つける必要があります。そのためには、リストをトラバースする必要があります。-これは再帰を使用して実行できます。フィルタリングは、トラバース関数の引数として渡された関数を使用して実行できます(この関数は要素を受け取り、ブール値を返す必要があります)。

上記を組み合わせて、独自の機能を作ってみてください。型シグネチャから始めて、何をしたいのかを示します。Charのリスト(ジェネリック型に一般化する方が良い)と、要素を変更して変更されたリストを返す可能性のある関数を取得します。

replaceFunc ::(Char-> Char)->文字列->文字列

また、 http://www.haskell.org/haskellwiki/How_to_work_on_listsを読んでください。特定の要素にのみいくつかの関数を適用する方法のヒントがあります。

于 2012-11-08T17:10:54.283 に答える