main = do
data Genotype = Dominant | Recessive | Heterozygous
cartProd :: [a] -> [a] -> [(a, a)]
cartProd xs ys = [ (x, y) | x <- xs, y <- ys ]
traitProb k m n = getProb list
where list = cartProd genotypes genotypes
genotypes = (replicate k Dominant) ++ (replicate m Heterozygous) ++ (replicate n Recessive)
getProb
= sum . map ((flip (/)) total
. getMultiplier
) getMultiplier (Dominant, Dominant) = 1.0
getMultiplier (Recessive, Dominant) = 1.0
getMultiplier (Dominant, Recessive) = 1.0
getMultiplier (Dominant, Heterozygous) = 1.0
getMultiplier (Heterozygous, Dominant) = 1.0
getMultiplier (Heterozygous, Heterozygous) = 0.75
getMultiplier (Heterozygous, Recessive) = 0.5
getMultiplier (Recessive, Heterozygous) = 0.5
getMultiplier (Recessive, Recessive) = 0.0
bWFpbiA9IGRvCglpbnAgPC0gZ2V0TGluZQoJbGV0IFtrLCBtLCBuXSA9IChtYXAgcmVhZCAuIHdvcmRzICQgaW5wKSA6OiBbSW50XQoJcHJpbnQgJCB0cmFpdFByb2IgayBtIG4gCgpkYXRhIEdlbm90eXBlID0gRG9taW5hbnQgfCBSZWNlc3NpdmUgfCBIZXRlcm96eWdvdXMKCmNhcnRQcm9kIDo6IFthXSAtPiBbYV0gLT4gWyhhLCBhKV0KY2FydFByb2QgeHMgeXMgPSBbICh4LCB5KSB8IHggPC0geHMsIHkgPC0geXMgXQoKCnRyYWl0UHJvYiA6OiBJbnQgLT4gSW50IC0+IEludCAtPiBEb3VibGUKdHJhaXRQcm9iIGsgbSBuID0gZ2V0UHJvYiBsaXN0CiAgICAgIHdoZXJlIGxpc3QgPSBjYXJ0UHJvZCBnZW5vdHlwZXMgZ2Vub3R5cGVzCiAgICAgICAgICAgIGdlbm90eXBlcyA9IChyZXBsaWNhdGUgayBEb21pbmFudCkgKysgKHJlcGxpY2F0ZSBtIEhldGVyb3p5Z291cykgKysgKHJlcGxpY2F0ZSBuIFJlY2Vzc2l2ZSkKICAgICAgICAgICAgZ2V0UHJvYiA9IHN1bSAuIG1hcCAoKGZsaXAgKC8pKSB0b3RhbCAuIGdldE11bHRpcGxpZXIpCiAgICAgICAgICAgIHRvdGFsID0gZnJvbUludGVncmFsICQgbGVuZ3RoIGxpc3QKICAgICAgICAgICAgZ2V0TXVsdGlwbGllciAoRG9taW5hbnQsIERvbWluYW50KSA9IDEuMAogICAgICAgICAgICBnZXRNdWx0aXBsaWVyIChSZWNlc3NpdmUsIERvbWluYW50KSA9IDEuMAogICAgICAgICAgICBnZXRNdWx0aXBsaWVyIChEb21pbmFudCwgUmVjZXNzaXZlKSA9IDEuMAogICAgICAgICAgICBnZXRNdWx0aXBsaWVyIChEb21pbmFudCwgSGV0ZXJvenlnb3VzKSA9IDEuMAogICAgICAgICAgICBnZXRNdWx0aXBsaWVyIChIZXRlcm96eWdvdXMsIERvbWluYW50KSA9IDEuMAogICAgICAgICAgICBnZXRNdWx0aXBsaWVyIChIZXRlcm96eWdvdXMsIEhldGVyb3p5Z291cykgPSAwLjc1CiAgICAgICAgICAgIGdldE11bHRpcGxpZXIgKEhldGVyb3p5Z291cywgUmVjZXNzaXZlKSA9IDAuNQogICAgICAgICAgICBnZXRNdWx0aXBsaWVyIChSZWNlc3NpdmUsIEhldGVyb3p5Z291cykgPSAwLjUKICAgICAgICAgICAgZ2V0TXVsdGlwbGllciAoUmVjZXNzaXZlLCBSZWNlc3NpdmUpID0gMC4w