2012-11-03 22 views
2

我正在学习haskell。我正在从文本文件中读取一个字符串,并且需要将此字符串变成char列表。我需要在Char列表中转换此字符串

输入文件是这样的:

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'] 

但它们是由 “;” 分隔

我该怎么办?

我该怎么办?

得到两份名单后,我送他们到这个代码:

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 
+3

'String'只是'[Char]'的一个类型别名。我不明白你的问题。 – Pubby

+0

我的问题,我从一个文件中读取这个字符串,并且需要通过它作为这个代码的一个例子 lcsList :: Eq a => [a] - > [a] - > [a] lcsList [] _ = [ ] lcsList _ [] = [] lcsList(X:XS)(Y:YS)=如果x ==ý 则x:XS YS lcsList 别的 让LCS1 lcsList =(X:XS)YS LCS2 lcsList = xs(y:ys) in if(length lcs1)>(length lcs2) 然后LCS1 其他LCS2 –

回答

4

粗略的方式打出每个这些字符串是像这样的东西 - 你可以在ghci中

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

,让你尝试:

"TACGATCAAAGCT" 

而且因为字符串只是Char的一个列表,它与以下内容相同:

['T', 'A', 'C', 'G', ... 
3

如果你的文件由几行,这是很简单:你只需要直到找到跳过一切“;”。如果你的文件只包含一行,你必须分别查找序列的开始和结束(提示:序列以空格结束)。写一个递归函数来完成任务,并使用函数takeWhiledropWhile

A String已经是Char的一个列表(它甚至被定义为这样:type String = [Char]),所以你不必做任何事情。如果您需要String的列表,其中每个String只包含一个字符,然后使用map来包装每个字符(再一次,每个String都是一个列表,因此您可以在这些列表上使用map)。包装一个字符,有三种选择:

  1. 使用lambda表达式:map (\c -> [c]) s
  2. 使用的操作部分:map (:[]) s
  3. 定义一个新的功能:wrap x = [x]

祝你好运!