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
-}