
MAN's nutshell explanation is good, and his rewrite of the Main module is type-correct. But note that the result of the `main` action (of type IO t for some type t) is deliberately discarded, so you probably want something more useful, such as: module Main where import Prime main = print (primeQ 123) Dean At 10:25 PM -0300 4/25/10, MAN wrote:
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