Send Beginners mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."
Today's Topics:
1. Re: Haskell triangular loop (correct use of (++)) (AntC)
2. I have simple question about Haskell (Eunsu Kim)
3. Re: i have questions about Haskell (Simon Jakobi)
4. Re: Applying a function to two lists (Matt Williams)
----------------------------------------------------------------------
Message: 1
Date: Sat, 23 Apr 2016 00:20:58 +0000 (UTC)
From: AntC <[email protected]>
To: [email protected]
Subject: Re: [Haskell-beginners] Haskell triangular loop (correct use
of (++))
Message-ID: <[email protected]>
Content-Type: text/plain; charset=utf-8
> rohan sumant <r.s.sumant <at> gmail.com> writes:
>
> ?The approach I am following is this :-
> mkpairs [] = []
>
> mkpairs (x:xs) = (map (fn x) xs) ++ (mkpairs xs)
> fn x y = (x,y)
>
> It is generating the desired output ...
Good! You've got the right approach for triangular loops.
That is a form
mkpairs (x:xs) = {- stuff -} $ mkpairs xs
A couple of things look non-idiomatic. So before I get on to your main question:
As well as an empty list being a special case,
neither can you make any pairs from a singleton ;-). I suggest:
mkpairs [x] = []
The auxiliary `fn` is messy. I would put explicit lambda:
mkpairs (x:xs) = map (\x' -> (x, x') ) xs ++ mkpairs xs
Or even switch on tuple sections
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/
syntax-extns.html#tuple-sections
mkpairs (x:xs) = map (x, ) xs ++ mkpairs xs
> but I am a bit unsure about the time complexity of the function mkpairs. ...
> I am particularly worried about the (++) operator. ...
You are spot-on! (++) has terrible time complexity.
Use the showS trick for constant-time concatenation.
Look in the Prelude for class Show a/method showsPrec,
explained in the Haskell 2010 report section 6.3.3.
To get that to work, you need a 'worker' function
to hand across the successor for each list.
It's conventional to call that `go`,
and because everyone uses `go`,
wrap it inside mkpairs using a `where`.
Complete code:
mkPairs [] = []
mkPairs [x] = []
mkPairs (x:xs) = go xs $ mkPairs xs
where go [] s = s
go (x':xs') s = (x, x') : go xs' s
Now is that any faster in practice?
Probably not until you get to a list with thousands of elements.
HTH
------------------------------
Message: 2
Date: Fri, 22 Apr 2016 22:55:48 -0500
From: Eunsu Kim <[email protected]>
To: [email protected]
Subject: [Haskell-beginners] I have simple question about Haskell
Message-ID: <[email protected]>
Content-Type: text/plain; charset="utf-8"
Hi
THIS IS MY CODE:
evalpoly = do putStr "What is the degree of polynomial: "
degree <- getLine
coeffs <- (funcOfCoeff ((read degree::Int)+1) [] )
putStr "What value do you want to evaluate at: "
value <- getLine
putStr "the value of "
putStr (printChar coeffs)
putStr (" evaluated at "++ value ++" is ")
putStrLn (show (getResult (coeffs) (read value :: Float) ))
printChar coeffs =parser([x | x <-reverse (zip coeffs (iterate (+1) 0)), fst x
/= 0])
parser []=""
parser (a:as)=show(fst a) ++ "x^" ++show(snd a) ++ " " ++(parser as)
?PROBLEM IS HERE!!!
---function loop to get coefficient--
funcOfCoeff 0 coeffs = do --to check the degree of 0
return coeffs --return list of coefficient
funcOfCoeff degree coeffs = do
putStr ("What is the x^" ++ show(degree-1))
putStr " coefficient: "
coeff <- getLine
loop <- funcOfCoeff (degree-1) ((read coeff :: Float) :
coeffs)
return loop
getResult (coeffs) x = sum(map(\(a,b) -> a*x^b).zip coeffs.iterate (+1)$0)
--evaluate polynomial with value
HERE IS MY OUTPUT:
*Main> evalpoly
What is the degree of polynomial: 2
What is the x^2 coefficient: 3
What is the x^1 coefficient: 2
What is the x^0 coefficient: 1
What value do you want to evaluate at: 7
the value of 3.0x^2 2.0x^1 1.0x^0 evaluated at 7 is 162.0
in output, on the very bottom part, there should be + or - sign there like
this: 3.0x^2 + 2.0x^1 - 1.0x^0
what should I do? I have no idea now?..
thanks
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20160422/c9c63af1/attachment-0001.html>
------------------------------
Message: 3
Date: Sat, 23 Apr 2016 05:58:30 +0200
From: Simon Jakobi <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] i have questions about Haskell
Message-ID:
<cagtp2sgmf_qktb-sjh2g-opd6rbd8s03fmha8frjqb3o2q9...@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8
Hi!
> when outputting the polynomial value, actually write out the polynomial,
> but:
> - skipping any missing monomials
> - not including any extraneous signs
> -not showing the constant term
>
> for the above example, the final line would be:
>
> The value of 1.0 x^3 - 2.0 x^2 + 10.0 evaluated at -1.0 is 7.0
Because this is apparently a homework problem that you're supposed to
solve yourself, I'll only give you a few pointers:
What the problem description hints at is a function with type
Polynomial -> String.
So in a first step you should define that data type Polynomial (or
whatever you want to call it). So far you seem to have been using a
list of coefficients to represent polynomials, so you might just build
on that existing representation, either by creating a type alias or
creating a separate "real" type with a constructor.
In a second step you need to write a function Polynomial -> String
with an appropriate definition. I'd recommend that you start by
generating a simpler string representation like "1.0 x^3 + -2.0 x^2 +
0.0 x^1 + 10.0" and refine your definition iteratively.
Cheers,
Simon
------------------------------
Message: 4
Date: Sat, 23 Apr 2016 08:50:32 +0000
From: Matt Williams <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] Applying a function to two lists
Message-ID:
<CAFTVGQbe-cCEPpts1EFgumfsA21NY+H_=zompsq8otix9jm...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
Thanks a lot for this.
Just to clarify (and ignoring the flip, which I can solve by rewriting the
checkNum function) - is this an example of currying?
M
On Fri, 22 Apr 2016 22:30 Francesco Ariis, <[email protected]> wrote:
> On Fri, Apr 22, 2016 at 10:20:19PM +0100, Matt Williams wrote:
> > I am looking for something like:
> >
> > list1 = [1,2,3,4,5,6]
> > list2 = [1,2,3,4,5,6]
> >
> > map checkNum list1 list2
> >
> > to return:
> >
> > [(1,[1]),(2[3,4,5]),(6,[3])
> >
> > (I have tried to simplify this a little, so my apologies if it looks
> > pointless - the real function is useful)
> >
> > Any help would be appreciated.
> >
> > Matt
>
> Hey Matt,
> if what you want is
>
> [checkNum 1 list2, checkNum 2 list2, etc.]
>
> then
>
> map (flip checknum list2) list1
>
> is what you want (flip signature being :: (a -> b -> c) -> b -> a -> c)
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20160423/4c14237d/attachment-0001.html>
------------------------------
Subject: Digest Footer
_______________________________________________
Beginners mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
End of Beginners Digest, Vol 94, Issue 23
*****************************************