module F2 where dnaLetter = "ACGT" data SeqTypes = Dna | Protein deriving (Show, Eq) data MolSeq = MolSeq String String SeqTypes deriving (Show) string2seq :: String -> String -> MolSeq string2seq namn sekvens = MolSeq namn sekvens (string2seqHelper namn sekvens) string2seqHelper :: String -> String -> SeqTypes string2seqHelper namn sekvens | (null sekvens) = Dna | (head sekvens) `elem` dnaLetter = string2seqHelper namn (tail sekvens) | otherwise = Protein seqName :: MolSeq -> String seqName (MolSeq namn sekvens typ) = namn seqSequence :: MolSeq -> String seqSequence (MolSeq namn sekvens typ) = sekvens seqType :: MolSeq -> SeqTypes seqType (MolSeq namn sekvens typ) = typ seqLength :: MolSeq -> Double seqLength (MolSeq namn sekvens typ) = sum [ 1 | _ <- sekvens] :: Double getAlpha :: MolSeq -> MolSeq -> Double getAlpha (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2) = sum [ if x == y then 1 else 0 | x <- sekvens1, y <- sekvens2] :: Double checkValidity :: MolSeq -> MolSeq -> Bool checkValidity (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2) = if typ1 == typ2 then True else False eDistanceDNA :: MolSeq -> MolSeq -> Double eDistanceDNA (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2) | alpha > 0.74 = 3.3 | otherwise = (-3/4)*log(1-(4*alpha/3)) where alpha = gA/(seqLength (MolSeq namn1 sekvens1 typ1)) gA = getAlpha (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2) eDistanceProtein :: MolSeq -> MolSeq -> Double eDistanceProtein (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2) | alpha > 0.94 = 3.7 | otherwise = (-19/20)*log(1-(20*alpha/19)) where alpha = gA/(seqLength (MolSeq namn1 sekvens1 typ1)) gA = getAlpha (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2) seqDistance :: MolSeq -> MolSeq -> Double seqDistance molseq1 molseq2 = if (checkValidity molseq1 molseq2) then (if (seqType molseq1) == Dna then eDistanceDNA molseq1 molseq2 else eDistanceProtein molseq1 molseq2) else error "FU BRO"
Comments