2017-11-06 10 views
2

私は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" 

私は相互コンダクタンスがAを置き換えるためである把握し、 任意のヒントなどなど、文字列全体をチェックし、Tを置き換え? ありがとうございます!

+1

すべてのCをGで置き換えた後、すべてのGをCで置き換えると、DNAにはCのみが追加されます。あなたは行くごとに各キャラクターを転記する必要があります。 –

+1

私は、指定された文字をその "反対の"文字にマップするタイプのChar - > Char'関数を作ることを提案します。次に、この機能をDNA鎖全体にマッピングすることができます。基本的には、すべてのラムダを1つの関数にまとめる必要があります。 –

+0

@ Code-Apprentice私はそれを[Char]にする必要がありました。新しい機能を備えたマップではエラーが発生していましたが、前に試したことがあります。 – Wireless

答えて

3

すべてのChar -> Charのコンバージョンを一度に処理する関数を1つ作成する必要があります。

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関数を使用することもできます。

dnaToRna :: [Char] -> Maybe [Char] 
dnaToRna = mapM (`lookup` zip "ATCG" "UAGC") . reverse 
+0

ああ、ありがとう、私は地図で何かをしようとしましたが、転写と呼ばれる別の機能を作っていましたが、あまりにも少ない引数のためにマップすることができます.... – Wireless

+0

IMO、あなたは、 OPのためのこのような問題を完全に解決することによって。 –

+2

@ Code-Apprentice私は実際に努力をして、ちょうど小さなプッシュを必要としている人々にこのような答えを与えることについて非常に淘汰しています。あなたが好きなら、私はチャットでこの問題について話し合うことができます。 – 4castle

0

@ 4castleの答えが正しい方向を示します。

OPの問題は解決されているので、ルックアップにData.Mapを使用すると、効率を上げる方法を示す価値があると思います。また、foldlを使用することによって、逆転ジョブもスキップすることができます。

+0

URソリューションをありがとう、それに見えます:) – Wireless

関連する問題