done. - marc
Am Mittwoch, 26. März 2003 23:32 schrieb Weix, Rachel Lynn: > P.S. The example given is for the set of sequences/strings (The,Masters) > > -----Original Message----- > From: Weix, Rachel Lynn > Sent: Wed 3/26/2003 4:30 PM > To: [EMAIL PROTECTED] > Cc: [EMAIL PROTECTED] > Subject: RE: Haskell help! > > > Currently I'm having problems with type checking due to Haskell being a > strongly typed language. In order to return all optimal solutions, my > professor suggested I create a list of tuples if they all have the same > score, as indicated in my new maxSeq method (see attachment). However, > this means that the maxSeq method would return type [[(Char,Char)]]. Since > maxSeq and getSeq must return the same type, I end up changing all my > signatures and end up with lots of problems. In my caseX methods, I can't > append [(Char)] to [[(Char,Char)]], and it also messes up trying to get my > score of each tuple, etc. I've been trying to solve the problem in Scheme > first but even then I'm having problems, and Scheme is only loosely typed. > Any suggestions? The format should be something like the following > (partial example): > > [ [(-,M)] [(T,a)(h,s)(-,t)(e,e)(-,r)(-,s)] [(-,s)(h,t)(e,e)(-,r)(-,s)]]]. > > Once I get back my list, I need to pair everything up in order to return a > list of optimal solutions. Taking the previous example, it would be the > following when paired up correctly: > > [ [(-,M)(T,a)(h,s)(-,t)(e,e)(-,r)(-,s)], > [(-,M)(T,a)(-,s)(h,t)(e,e)(-,r)(-,s)] ] > > From there, I find which sequence has the maximum score. I then walk > through the list again, making a list of all the sequences that have that > score. These two steps seem fairly trivial, it's all the above stuff which > I'm struggling on. > > Rachel > > -----Original Message----- > From: Marc Ziegert [mailto:[EMAIL PROTECTED] > Sent: Tue 3/25/2003 3:13 PM > To: Weix, Rachel Lynn > Cc: > Subject: Re: Haskell help! > > > > maxSeq had one mistake: || instead of && > > i will think about the problem itself, before rewriting all. > > this is the file a little bit more in haskell style. > > Am Dienstag, 25. März 2003 20:16 schrieben Sie: > > I found my two mistakes, plus I fixed the method my Professor said > was > > incorrect. Now I just have to be able to find ALL optimal solutions, > > instead of just one. Hooray! > > > > Rachel
module Main where type VSeqs = (Integer,[(String,String)]) -- valued sequences type VS_matrix = [[VSeqs]] emptyVS :: VSeqs emptyVS = (0,[("","")]) rightmostCol :: String -> [VSeqs] rightmostCol "" = [emptyVS] rightmostCol (c:cs) = (v-1,[('~':s1,c:s2)]) : above where above@((v,(s1,s2):_):_) = rightmostCol cs nextCol :: Char -> String -> [VSeqs] -> [VSeqs] nextCol c "" ((v,(s1,s2):_):_) = (v-1,(c:s1,'~':s2):[]):[] nextCol c str2 (vs:vsr) = makeEntry c str2 (head above) vs (head vsr) : above where above = nextCol c (tail str2) vsr makeEntry :: Char-> String -> VSeqs -> VSeqs -> VSeqs -> VSeqs makeEntry c str2@(h:_) above@(va,sa) right@(vr,sr) aboveright@(vd,sd) = maxEntry fa fr fd where fa = (va-1, append '~' h sa ) fr = (vr-1, append c '~' sr ) fd = (vd+v, append c h sd ) v = if c==h then 1 else -1 append l r tups = [ (l:ls,r:rs) | (ls,rs)<-tups ] maxEntry :: VSeqs -> VSeqs -> VSeqs -> VSeqs maxEntry a@(va,_) b@(vb,_) c@(vc,_) = if va>vb then if va>vc then a else c else if vb>vc then b else c fillmatrix :: String -> String -> VS_matrix fillmatrix str1 str2 = scanr xcc (rightmostCol str2) str1 where xcc :: Char -> [VSeqs] -> [VSeqs] xcc x s = nextCol x str2 s findBestSeqs :: String -> String -> VSeqs findBestSeqs str1 str2 = head $ head $ fillmatrix str1 str2 main :: IO () main = do putStr "\"icecream\" \"scheme\" : " putStrLn $ show $ findBestSeqs "icecream" "scheme" putStr "\"hate\" \"hatter\" : " putStrLn $ show $ findBestSeqs "hate" "hatter" putStr "\"scheme\" \"saturn\" : " putStrLn $ show $ findBestSeqs "scheme" "saturn" putStr "\"saturn\" \"scheme\" : " putStrLn $ show $ findBestSeqs "saturn" "scheme" putStr "\"saturn\" \"hatter\" : " putStrLn $ show $ findBestSeqs "saturn" "hatter" putStr "\"hatter\" \"saturn\" : " putStrLn $ show $ findBestSeqs "hatter" "saturn" putStr "\"mad\" \"saturn\" : " putStrLn $ show $ findBestSeqs "mad" "saturn" putStr "\"snowball\" \"icecream\": " putStrLn $ show $ findBestSeqs "snowball" "icecream" putStr "\"mad\" \"computer\": " putStrLn $ show $ findBestSeqs "mad" "computer" putStr "\"mad\" \"snowball\": " putStrLn $ show $ findBestSeqs "mad" "snowball" {- --Sample Sequences icecream = "icecream" scheme = "scheme" saturn = "saturn" -- "saaturn" mad = ['m','a','d'] hatter = ['h','a','t','t','e','r'] hate = ['h','a','t','e'] snowball = ['s','n','o','w','b','a','l','l'] computer = ['c','o','m','p','u','t','e','r'] coffee = ['c','o','f','f','e','e'] --Function that's called in a console window which does the sequence --alignment and puts the two optimal sequences back together printSeq :: String -> String -> (String,String) printSeq s1 s2 = unzip (getSeq s1 s2) --Main function of the program which does the actual sequence alignment getSeq :: String -> String -> [(Char,Char)] getSeq [] [] = [] getSeq [] s2 = case2 [] s2 getSeq s1 [] = case3 s1 [] getSeq s1 s2 = let a1 = case1 s1 s2; a2 = case2 s1 s2; a3 = case3 s1 s2; in maxSeq a1 a2 a3 case1 :: [Char] -> [Char] -> [(Char,Char)] case1 s1 s2 = [(head s1,head s2)] ++ getSeq (tail s1) (tail s2) case2 :: [Char] -> [Char] -> [(Char,Char)] case2 s1 s2 = [('-',head s2)] ++ getSeq s1 (tail s2) case3 :: [Char] -> [Char] -> [(Char,Char)] case3 s1 s2 = [(head s1,'-')] ++ getSeq (tail s1) s2 --Grab the score of one tuple (a possible alignment) score :: (Eq a) => (a,a) -> Integer score (c1,c2) | c1==c2 = 1 | otherwise = -1 --Sum up the score for a sequence scoreSum :: (Eq a) => [(a,a)] -> Integer scoreSum seq = sum $ map score seq --Returns a solution maxSeq :: (Eq a) => [(a,a)] -> [(a,a)] -> [(a,a)] -> [(a,a)] maxSeq a1 a2 a3 | s1 > s2 && s1 > s3 = a1 | s3 > s1 && s3 > s2 = a3 | otherwise = a2 where s1 = scoreSum a1 s2 = scoreSum a2 s3 = scoreSum a3 -}