Advertisement
Guest User

Untitled

a guest
Sep 30th, 2018
364
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.54 KB | None | 0 0
  1. module RnaTranscription
  2.  
  3. module Dna =
  4.     type Nucleotides = A | C | G | T with
  5.         static member Parse = function
  6.             | 'A' -> Ok A
  7.             | 'C' -> Ok C
  8.             | 'G' -> Ok G
  9.             | 'T' -> Ok T
  10.             | c -> Error (sprintf "%c is not a DNA nucleotide" c)
  11.        
  12.     let parse (dna: string) =
  13.         let folder (state, ind) item =
  14.             let formatError ind err =
  15.                 sprintf "(%d): %s" ind err
  16.  
  17.             let result =
  18.                 match state, item with
  19.                 | Ok x,     Ok y    -> Ok (seq {yield! x; yield y})
  20.                 | Error x,  Ok _    -> Error x
  21.                 | Ok _,     Error y -> Error (formatError ind y)
  22.                 | Error x,  Error y -> Error (sprintf "%s\r\n%s" x (formatError ind y))
  23.  
  24.             result, ind + 1
  25.  
  26.         dna
  27.         |> Seq.map Nucleotides.Parse
  28.         |> Seq.fold folder (Ok Seq.empty, 0)
  29.         |> fst
  30.  
  31. module Rna =
  32.     type Nucleotides = A | C | G | U
  33.  
  34.     let toString (rna: Nucleotides seq) =
  35.         rna
  36.         |> Seq.map string
  37.         |> String.concat ""
  38.  
  39. module Transcription =    
  40.  
  41.     let dnaToRna (dna: Dna.Nucleotides seq) =
  42.         let mapper = function
  43.             | Dna.G -> Rna.C
  44.             | Dna.C -> Rna.G
  45.             | Dna.T -> Rna.A
  46.             | Dna.A -> Rna.U
  47.        
  48.         Seq.map mapper dna
  49.  
  50. let toRna (dna: string) =
  51.     match Dna.parse dna with
  52.     | Ok dna -> dna |> Transcription.dnaToRna |> Rna.toString
  53.     | Error msg -> sprintf "Invalid DNA sequence.\n%s" msg
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement