[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