<br>Hi,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I am a student and we had an
assignment in Haskell. The question, was given a string of the form&nbsp;
&quot;1-2+3*5-7+4-6+3&quot; i.e., any sequence of integers as well as some
operators between them we had to find a maximum possible value for the
expression as well as the expression itself . So for maxval
&quot;1-2+3*5-7+4-6+3&quot; it is (76,&quot;(1-((2+3)*((5-(7+4))-(6+3))))&quot;). The
function we had to write was maxval :: String -&gt; (Int,String). For
further details on the question, have a look at <a href="http://www.cmi.ac.in/%7Emadhavan/courses/programming08/assignment6.txt" target="_blank">our sir&#39;s web page here</a>.
I solved the question, we had to use memoization, and submitted the
solution. It is given below. Now the problem is I am just wondering if
it can be solved in a better manner. Translation : Is there some way in
Haskell to do it in a more simpler way and as well as to reduce the
number of lines of the program.<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">{-<br>---------------------------------------------------------------------------------------------------------------------------<br>

*********************** module Memo.hs ******************************************************<br>
---------------------------------------------------------------------------------------------------------------------------<br>
-}<br>module Memo(Table,emptytable,memofind,memolookup,memoupdate,memoupdateArray) where<br><br>data (Eq a) =&gt; Table a b c = T [(a,a,(b,c),(b,c))]<br>&nbsp;&nbsp;&nbsp; deriving (Eq,Show)<br><br>emptytable :: (Eq a) =&gt; (Table a b c)<br>


emptytable = T []<br><br>memofind ::&nbsp; (Eq a) =&gt; (Table a b c) -&gt;(a,a)-&gt; Bool<br>memofind (T []) _&nbsp; = False<br>memofind (T ((y,z,(v1,s1),(v2,s2)):l)) x<br>&nbsp;&nbsp;&nbsp; | x&nbsp; == (y,z) &nbsp;&nbsp;&nbsp; = True<br>&nbsp;&nbsp;&nbsp; | otherwise &nbsp;&nbsp;&nbsp; = memofind (T l) x<br>


<br>memolookup :: (Eq a) =&gt; (Table a b c) -&gt; (a,a) -&gt; ((b,c),(b,c))<br>memolookup (T ((y,z,(v1,s1),(v2,s2)):l)) x<br>&nbsp;&nbsp;&nbsp; | x == (y,z)&nbsp;&nbsp;&nbsp; = ((v1,s1),(v2,s2))<br>&nbsp;&nbsp;&nbsp; | otherwise = memolookup (T l) x<br><br>memoupdate :: (Eq a) =&gt; (Table a b c) -&gt; (a,a,(b,c),(b,c)) -&gt; (Table a b c)<br>


memoupdate (T l) x =&nbsp; T (x:l)<br><br>memoupdateArray :: (Eq a) =&gt; (Table a b c) -&gt; [(a,a,(b,c),(b,c))] -&gt; (Table a b c)<br>memoupdateArray t [] = t<br>memoupdateArray t (x:xs) =&nbsp; memoupdate (memoupdateArray t xs) x<br>


<br>{-<br>---------------------------------------------------------------------------------------------------------------------------<br>***********************End of module Memo.hs***********************************************<br>


---------------------------------------------------------------------------------------------------------------------------<br>-}<br><br><br>{-<br>---------------------------------------------------------------------------------------------------------------------------<br>



******************The actual program , assign-6.hs******************************************<br>
---------------------------------------------------------------------------------------------------------------------------<br>
-}<br><br>minArray :: [(Int,String)] -&gt; (Int,String)<br>minArray ((x,expr):[])&nbsp; = (x,expr)<br>minArray ((x,expr):l)&nbsp;&nbsp; |((min x (fst (minArray l))) ==x) = (x,expr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |otherwise&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp; (minArray l)<br>


<br>maxArray :: [(Int,String)] -&gt; (Int,String)<br>maxArray ((x,expr):[])&nbsp; = (x,expr)<br>maxArray ((x,expr):l)&nbsp;&nbsp; |((max x (fst (minArray l))) ==x) = (x,expr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |otherwise&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp; (minArray l)<br>


<br>import Memo<br>import Char<br><br>type Tuple = (Int,Int,(Int,String),(Int,String))<br><br>maxval :: String -&gt;(Int, String)&nbsp; <br>maxval expr = snd (memolookup (buildmemo expr 1 emptytable) (1,length expr))<br><br>initmemo :: (String) -&gt; (Table Int Int String)<br>


initmemo expr&nbsp;&nbsp;&nbsp; = (memoupdateArray (emptytable) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [(i,i,(toInt(expr!!(i-1)),[expr!!(i-1)]),<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (toInt(expr!!(i-1)),[expr!!(i-1)]))|i&lt;-[1..length expr],j&lt;-[0,1],i `mod` 2 ==1])<br>


<br>buildmemo :: (String)-&gt;Int -&gt; (Table Int Int String)-&gt; (Table Int Int String)<br>buildmemo expr col memo&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; | (col &gt; length expr)&nbsp;&nbsp;&nbsp; =&nbsp; memo<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; | (col == 1)&nbsp;&nbsp;&nbsp; = buildmemo expr 3 (memoupdateArray (emptytable) <br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; [(i,i,(toInt(expr!!(i-1)),[expr!!(i-1)]),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (toInt(expr!!(i-1)),[expr!!(i-1)]))|i&lt;-[1..length expr],i `mod` 2 ==1])<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; | otherwise&nbsp; &nbsp;&nbsp;&nbsp; = buildmemo expr (col+2) (memoupdateArray (memo) (createList expr memo (1,col)))<br>


<br>createList :: String-&gt; (Table Int Int String) -&gt; (Int,Int) -&gt; [Tuple]<br>createList expr memo (i,j) &nbsp;&nbsp;&nbsp; | j &gt; (length expr) = []<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; | otherwise&nbsp;&nbsp;&nbsp; = (i,j,min_expr,max_expr):(createList expr memo (i+2,j+2))<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; where<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; min_expr = minArray [x | (x,y) &lt;- list]<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; max_expr = maxArray [y | (x,y) &lt;- list]<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; list &nbsp;&nbsp;&nbsp; &nbsp;= [(compute memo (i,k) (k+2,j) (expr!!k))|k&lt;-[i..j-2],k `mod` 2 ==1]<br>


<br>compute :: (Table Int Int String)-&gt;(Int,Int)-&gt;(Int,Int)-&gt;Char-&gt;((Int,String),(Int,String))<br>compute memo (x1,x2) (y1,y2)&nbsp;&nbsp;&nbsp; &nbsp;op &nbsp;&nbsp;&nbsp; |op == &#39;+&#39; = ((min1+min2,&quot;(&quot;++min1_expr++&quot;+&quot;++min2_expr++&quot;)&quot;),<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (max1+max2,&quot;(&quot;++max1_expr++&quot;+&quot;++max2_expr++&quot;)&quot;))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; |op == &#39;-&#39; = ((min1-max2,&quot;(&quot;++min1_expr++&quot;-&quot;++max2_expr++&quot;)&quot;),<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (max1-min2,&quot;(&quot;++max1_expr++&quot;-&quot;++min2_expr++&quot;)&quot;))&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; |op == &#39;*&#39; = (minArray xs,maxArray xs)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; where<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; xs = [(min1*min2,&quot;(&quot;++min1_expr++&quot;*&quot;++min2_expr++&quot;)&quot;),<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (min1*max2,&quot;(&quot;++min1_expr++&quot;*&quot;++max2_expr++&quot;)&quot;),<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; (max1*min2,&quot;(&quot;++max1_expr++&quot;*&quot;++min2_expr++&quot;)&quot;),<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (max1*max2,&quot;(&quot;++max1_expr++&quot;*&quot;++max2_expr++&quot;)&quot;)]<br>


&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ((min1,min1_expr),(max1,max1_expr)) = (memolookup memo (x1,x2))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ((min2,min2_expr),(max2,max2_expr)) = (memolookup memo (y1,y2))<br><br>minArray :: [(Int,String)] -&gt; (Int,String)<br>


minArray ((x,expr):[]) &nbsp;&nbsp;&nbsp; = (x,expr)<br>minArray ((x,expr):l) &nbsp;&nbsp;&nbsp; |((min x (fst (minArray l))) ==x) = (x,expr)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; |otherwise&nbsp;&nbsp;&nbsp; =&nbsp; (minArray l)<br><br>maxArray :: [(Int,String)] -&gt; (Int,String)<br>maxArray ((x,expr):[])&nbsp; = (x,expr)<br>


maxArray ((x,expr):l)&nbsp;&nbsp; |((max x (fst (maxArray l))) ==x) = (x,expr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |otherwise&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp; (maxArray l)<br><br>toInt :: Char -&gt; Int<br>toInt x = ord x - ord &#39;0&#39;<br><br>{-<br>---------------------------------------------------------------------------------------------------------------------------<br>



***********************End of program assign-6.hs*******************************************<br>
---------------------------------------------------------------------------------------------------------------------------<br>-}</blockquote>