heltonbiker
heltonbiker

Reputation: 27615

Simple print in haskell script: how to write main function?

I am starting to learn haskell, but cannot find a way to have a working main function. I have already made it work somehow, but I think it was pure luck because I cannot get it again.

Basically, what I want to do is create a script file to be run like runhaskell script.hs from terminal.

So the basic structure would be the function declaration followed by a main = do or something, and the function being called to print its result.

For example, I took this from "Learn you a Haskell", but the following code doesn't work:

elem' :: (Eq a) => a -> [a] -> Bool  
elem' y ys = foldl (\acc x -> if x == y then True else acc) False ys  

main :: IO()
main = print (elem' 1 [1,2,3,4])

This gives me the error:

Build FAILED

/home/helton/Desktop/apaga.hs: line 6, column 16:
  Warning: Defaulting the following constraint(s) to type `Integer'
    (Eq a0)
      arising from a use of elem'
      at /home/helton/Desktop/apaga.hs:6:16-20
    (Num a0)
      arising from the literal `1' at /home/helton/Desktop/apaga.hs:6:22
  In the first argument of `print', namely `(elem' 1 [1, 2, 3, 4])'
  In a stmt of a 'do' block: print (elem' 1 [1, 2, 3, 4])
  In the expression: do { print (elem' 1 [1, 2, 3, 4]) }
    print (elem' 1 [1,2,3,4])

While I expected something like

> True

Upvotes: 0

Views: 637

Answers (1)

chi
chi

Reputation: 116174

Try replacing

print (elem' 1 [1, 2, 3, 4])

with

print (elem' (1::Int) [1, 2, 3, 4])

The issue here is that Haskell can't determine whether your numeric literals should be interpreted as Ints or Doubles or any other numeric type.

Specifying the type for any numeric literal here is enough, since elem' requires all of them to be of the same type, hence once the type of any one of them is known such type can be used for everything else.

Upvotes: 2

Related Questions