2

私はhaskellを学んでいます。テキストファイルから文字列を読み取っていますが、この文字列を文字のリストにする必要があります。

入力ファイルは次のとおりです。

Individuo A; TACGATCAAAGCT 
Individuo B; AATCGCAT 
Individuo C; TAAATCCGATCAAAGAGAGGACTTA 

この文字列を変換する必要があります

S1 = "AAACCGGTTAAACCCGGGG"  in  S1 = 
["A","A","A","C","C","G","G","T","T","A","A","A","C","C","C","G","G","G","G"] 
or S1 = 
['A','A','A','C','C','G','G','T','T','A','A','A','C','C','C','G','G','G','G'] 

しかし、それらは「;」で区切られています

私は何をすべきか?

私に何ができる?

2つのリストを取得した後、それらを次のコードに送信します。

lcsList :: Eq a => [a] -> [a] -> [a]
lcsList [] _ = []
lcsList _ [] = []
lcsList (x:xs) (y:ys) = if x == y
                          then x : lcsList xs ys
                          else
                            let lcs1 = lcsList (x:xs) ys
                                lcs2 = lcsList xs (y:ys)
                            in if (length lcs1) > (length lcs2)
                                  then lcs1
                                  else lcs2
4

2 に答える 2

4

これらの文字列のそれぞれを分割するための大まかな準備ができた方法は、次のようなものを使用することです-これはghciで試すことができます

let a = "Individuo A; TACGATCAAAGCT"
tail $ dropWhile (/= ' ') $ dropWhile (/= ';') a

それはあなたに与えます:

"TACGATCAAAGCT"

また、文字列は単なる文字のリストであるため、これは次のようになります。

['T', 'A', 'C', 'G', ...
于 2012-11-03T17:59:47.130 に答える
3

ファイルが複数行で構成されている場合、それは非常に単純です。「;」が見つかるまですべてをスキップする必要があります。ファイルが1行だけで構成されている場合は、シーケンスの開始と終了を別々に検索する必要があります(ヒント:シーケンスはスペースで終了します)。タスクを実行する再帰関数を記述し、関数を使用しtakeWhileますdropWhile

AStringはすでにリストにCharなっているので(次のように定義されtype String = [Char]ています:)、他に何もする必要はありません。Stringすべてが1つの文字のみで構成されるsのリストが必要な場合はString、を使用mapしてすべての文字をラップします(もう一度、すべてStringがリストであるためmap、これらで使用できます)。文字をラップするには、次の3つの方法があります。

  1. ラムダ関数を使用します:map (\c -> [c]) s
  2. 演算子セクションを使用します。map (:[]) s
  3. 新しい関数を定義します。wrap x = [x]

幸運を!

于 2012-11-03T17:48:14.100 に答える