我正在尝试制作一个 DNA 转录程序,但我的做法遇到了麻烦,我确信有一种更简单的方法可以做到这一点,但这是我想到的第一件事,但事实并非如此按照我想要的方式工作。
dnaToRna :: [Char] -> [Char]
dnaToRna [] = []
dnaToRna xs = reverse(transc xs)
where transc = (replaceA . replaceT . replaceC . replaceG)
replaceA = map(\c -> if c == 'A' then 'U' else c)
replaceT = map(\c -> if c == 'T' then 'A' else c)
replaceC = map(\c -> if c == 'C' then 'G' else c)
replaceG = map(\c -> if c == 'G' then 'C' else c)
这是输出:
*Main> let seq = "AAATGTTAGTACACTAAGG"
*Main> dnaToRna seq
"GGUUUGUGUUGUUUGUUUU"
我认为这是因为 transc 替换了 A,然后检查整个字符串并替换了 T,等等
有小费吗?
提前致谢!
你应该创建一个函数来处理所有的Char -> Char
立即转换。
dnaToRna :: [Char] -> [Char]
dnaToRna = reverse . map transc
where
transc 'A' = 'U'
transc 'T' = 'A'
transc 'C' = 'G'
transc 'G' = 'C'
transc _ = error "Invalid DNA molecule"
为了使其更安全,您可以让它返回Maybe [Char]
反而。这lookup http://hackage.haskell.org/package/base-4.10.0.0/docs/Prelude.html#v:lookup也可以使用函数来代替使用自定义映射函数。
dnaToRna :: [Char] -> Maybe [Char]
dnaToRna = mapM (`lookup` zip "ATCG" "UAGC") . reverse
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)