我正在学习哈斯克尔。我正在从文本文件中读取一个字符串,需要使该字符串成为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
答案 0 :(得分:4)
分离出每个字符串的粗略和准备的方法是这样的 - 你可以在ghci中尝试
let a = "Individuo A; TACGATCAAAGCT"
tail $ dropWhile (/= ' ') $ dropWhile (/= ';') a
给你:
"TACGATCAAAGCT"
因为String只是Char的列表,所以它与:
相同['T', 'A', 'C', 'G', ...
答案 1 :(得分:3)
如果你的文件由几行组成,那很简单:你只需要跳过所有内容,直到找到“;”。如果您的文件只包含一行,则必须单独查找序列的开头和结尾(提示:序列以空格结尾)。编写递归函数来执行任务,并使用函数takeWhile
,dropWhile
。
String
已经是Char
的列表(它甚至定义如下:type String = [Char]
),因此您无需执行任何其他操作。如果你需要一个String
的列表,其中每个String
只包含一个字符,那么使用map
来包装每个字符(再次,每个String
都是一个列表,所以你可以在这些上使用map
。要包装char,有三种选择:
map (\c -> [c]) s
map (:[]) s
wrap x = [x]