我正在使用 Haskell(特別是位元組串)撰寫 DNA 翻譯器。我有以下代碼:
import Data.Maybe
import Data.Monoid ((<>))
import System.Environment
import qualified Data.ByteString as B
import Data.ByteString.Lazy.Char8 (ByteString, singleton, splitWith)
import qualified Data.ByteString.Lazy as LB
-- Extract DNA sequence from fasta file
xtractDNA :: [ByteString] -> Maybe ByteString
xtractDNA dna = Just (LB.concat dna)
--xtractDNA = foldr ((<>) . Just) Nothing
-- Reverse Complement DNA
compStrand :: Maybe ByteString -> Maybe ByteString
compStrand = foldr ((<>) . compPairs) Nothing
where
compPairs nt | nt == (singleton 'A') = Just (singleton 'T')
| nt == (singleton 'T') = Just (singleton 'A')
| nt == (singleton 'G') = Just (singleton 'C')
| nt == (singleton 'C') = Just (singleton 'G')
| otherwise = Nothing
main :: IO ()
main = do
putStrLn "Welcome to volcano"
let fname = "/home/russellb/Development/hs_devel/local_data/shbg.fasta"
fid <- LB.readFile fname
let dna = LB.concat $ tail (LB.splitWith (==10) fid)
--putStrLn $ show (LB.length (head dna))
let dsDna = compStrand (Just dna)
print dsDna
當我執行時,我得到Nothing了答案。輸入的一部分是
“...ACAAGGTCAGAGGCTGGATGTGGACCAGGCCCTGAACAGAAGCCATGAGATCTGGACTCACAGCTGCCCCCAGAGCCCAGGCAATGGCACTGACGCTTCCCATTAAAGCTCCACCTAAGAACCCCC”
我懷疑是我的模式匹配護衛有問題。我怎樣才能弄清楚并解決這個問題?任何見解將不勝感激
uj5u.com熱心網友回復:
compStrand是一個很奇怪的函式。為什么當你只傳遞一個 Just 時它需要一個 Maybe ByteString 而不是一個實際的 ByteString ?為什么它會做這種古怪的foldr ((<>) . compPairs) Nothing事情,這只是一個非常難以閱讀的重新實作(>>= compPairs)?
main不是很清楚:如果您的輸入是 GATC 字串,為什么要在第一個等于 10 的位元組上進行拆分?為什么它不使用xtractDNA你為它撰寫的這個函式?
解決這些問題將產生一個更簡單的函式,您可以更輕松地自行除錯。但我會注意到,您的compStrand函式似乎只對單例字串進行操作,但您似乎向它傳遞了一個未知大小的字串。
uj5u.com熱心網友回復:
您正在使用foldr有作為Foldable的Maybe,不是ByteString。因此,它將檢查Maybe a. 如果它是Just,它將comPairs使用整個 ByteStringDNA呼叫,否則它將回傳Nothing。
您comPairs將回傳Nothing任何ByteString空的或具有兩個或更多位元組的內容,因此它回傳Nothing.
您可以使用 amapM :: Monad m => (a -> m b) -> [a] -> m [b]來構造 aMaybe [Word8]然后將其轉換回 a ByteString:
import Data.ByteString.Lazy.Char8 (ByteString, pack, unpack)
compStrand :: Maybe ByteString -> Maybe ByteString
compStrand = (>>= fmap pack . mapM comPairs . unpack)
where comPairs 'A' = Just 'T'
comPairs 'C' = Just 'G'
comPairs 'G' = Just 'C'
comPairs 'T' = Just 'A'
comPairs _ = Nothing
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387009.html
上一篇:函式的通用運算子
