Vorrei modellare alcune catene nucleotidiche: ADN & ARN. ADN è un elenco di nucleotidi: A, T, G, C. ARN è una lista di nucleotidi: A, U, G, C.
idealmente, vorrei definire per es. ADN come elenco di tipi di dati A, T, G, C.
Ho questo codice, che funziona ma non è sufficiente:
data NtADN = Td | Ad | Cd | Gd deriving (Eq)
data NtARN = Ur | Ar | Cr | Gr deriving (Eq)
data ADN = ADN [NtADN] deriving (Eq)
data ARN = ARN [NtARN] deriving (Eq)
class NucleotidChain a where
valid :: a -> Bool
countACGX :: a -> (Int,Int,Int,Int)
ma non ne sono soddisfatto: i nucleotidi sono dichiarati 2 volte con suffissi arbitrari (Ad, Ar ...)
inoltre, countACGX, che conta il numero di ciascun nucleotide in ADN e amp; Gli ARN devono essere dichiarati 2 volte, uno per ADN e uno per ARN:
instance NucleotidChain ADN where
valid (ADN s) = all (\t->(t==Ad)|| (t==Td)||(t==Cd)||(t==Gd)) s
countACGX (ADN s) =
let a= length $ elemIndices Ad s
c= length $ elemIndices Cd s
g= length $ elemIndices Gd s
t= length $ elemIndices Td s
in (a,c,g,t)
instance NucleotidChain ARN where
valid (ARN s) = all (\t-> (t==Ur) || (t==Ar) || (t==Cr) || (t==Gr)) s
countACGX (ARN s) =
let a= length $ elemIndices Ar s
c= length $ elemIndices Cr s
g= length $ elemIndices Gr s
u= length $ elemIndices Ur s
in (a,c,g,u)
c'è un modo per sbarazzarsi di questa duplicazione? per dichiarare solo 5 nucleotidi (A, T, G, C, U) e soprattutto perché non avere successo nel dichiarare un dato ADN (e ARN) come una matrice di elementi preso nel risultato di una funzione diversa per ADN (& ARN)? come ad esempio:
data Nt = A | T | G | C | U
data ADN = ADN [nts]
data ARN = ARN [nts]
class NtChain a where
nts :: [Nt]