[Haskell-beginners] Trying to compile my first program that
imports another program
MAN
elviotoccalino at gmail.com
Sun Apr 25 21:25:32 EDT 2010
Hi, Mitchell
First of all, you don't really need to compile your module Prime to be
able to import it. Supposing you just want to, though:
Your funcion primeO is 'pure', it work on numbers only, and will return
the same results for the same arguments every time, without "launching
missiles" or side-effects of any kind.
The main function (in the Main module), which is the 'main entry
point' (like in C), is of type 'IO ()' ... this means a lot, and you
should really look into types for Haskell; but in a nutshell, it means
the function 'main' may have side-effects (like printing to stdout, or
opening a socket, deleting a file, etc) which cannot be predicted.
Haskell is very careful as to keep pure code pure, and non-pure code,
well, non-pure... [check out 'monads']. The 'main' function is of type
'IO ()', so all functions called by it must have type 'IO something'.
[IO is a monad]. Your function prime0 is of type 'Bool', so you need to
inject it into the 'IO' [get it into the monad]. This is done with the
function 'return' (which is quite different to that of C):
module Main where
import Prime
main = return (primeQ 123)
BTW, your Haskell program must have a Main module. You will write your
modules with "module SomeThing where", and name that file SomeThing.hs;
the Main module can have any filename you want, though.
El dom, 25-04-2010 a las 21:07 -0400, Mitchell Kaplan escribió:
> Hi,
>
>
>
> I created (with help) a function to test for prime numbers. It worked
> well enough for now in ghci.
>
>
>
> ----------------
>
> f x n y
>
> | n>y = True
>
> | rem x n == 0 = False
>
> | otherwise = f x (n+1) y
>
>
>
> primeQ x = f x 2 y
>
> where
>
> y = floor(sqrt(fromIntegral x))
>
> ---------------
>
>
>
> I then wanted to create object code so that I could import it. It
> seemed that I had to precede the above with the 2 lines:
>
>
>
> ----------------
>
> module Prime
>
> where
>
> ----------------
>
>
>
> I ran:
>
> ghc –c prime.hs, and created prime.o and prime.hi.
>
>
>
>
>
> Next, I wanted to write a program to import and use this function.
>
>
>
> I wrote:
>
>
>
> ------------
>
> module Main () where
>
> import Prime
>
> main = primeQ 123
>
> ------------
>
>
>
> I tried to compile this with:
>
> ghc –o test Main.hs prime.o
>
>
>
> I got the following error:
>
> Main.hs:5:0:
>
> Couldn’t match expected type ‘IO t’ against inferred type
> ‘Bool’
>
> In the expression: main
>
> When checking the type of the function ‘main’
>
> ----------------
>
>
>
> First I’d like a hint as to what I need to do to make this work.
>
>
>
> It’s pretty obvious that I don’t know what I’m doing with regard to
> types. Also, I have no idea if I have to name this module Main, but
> when I didn’t the compiler complained about that.
>
>
>
> In the function that I think I had to re-write to make object code, I
> wound up with 2 where statements, which worries me.
>
>
>
> I’d really appreciate any help in getting me unraveled.
>
>
>
> Mitchell
>
>
>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
More information about the Beginners
mailing list