Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Haskell main function

Tags:

haskell

module Main where

qsort :: Ord a => [a] -> [a]
qsort [] = []
qsort (x : xs) = qsort smaller ++ [x] ++ qsort larger
                 where
                   smaller = [a | a <- xs , a <= x]
                   larger  = [a | a <- xs , a >  x]

main = do qsort [1,3,2]

I get the following error

Couldn't match expected type `IO t0' with actual type `[a0]'         
In the expression: main
When checking the type of the function `main'

What am I doing wrong?

like image 647
weima Avatar asked Oct 20 '14 21:10

weima


People also ask

What is main function in Haskell?

The use of the name main is important: main is defined to be the entry point of a Haskell program (similar to the main function in C), and must have an IO type, usually IO (). (The name main is special only in the module Main; we will have more to say about modules later.)

What are function types in Haskell?

Functions can also be passed as arguments or returned (as we have seen). Their types are given in the type signature. *Main> :t map map :: (a -> b) -> [a] -> [b] *Main> :t filter filter :: (a -> Bool) -> [a] -> [a] flip_args :: (a -> b -> c) -> b -> a -> c flip_args f x y = f y x.

Is everything in Haskell a function?

> In fact, in haskell, everything is a function.


1 Answers

All functions within a do block must match the monadic value being returned. You could instead write

main = do
    print (qsort [1, 3, 2])

Because print returns an IO value. Similarly, if you were using the Maybe monad, you would have to do something like

-- lookup :: Eq k => k -> [(k, v)] -> Maybe v
-- listToMaybe :: [a] -> Maybe a

firstElementOf :: Eq q => k -> [(k, [v])] -> Maybe v
firstElementOf key assocMap = do
    v <- lookup key assocMap
    first <- listToMaybe v
    return first

This works because lookup and listToMaybe both return a Maybe, which is the return value of the overall do block as specified by the type signature of firstElementOf.

Looking at the type of qsort, it only returns [a], not IO something, so it can't be used directly inside main's do block. You could also assign it's returned value to a name using let:

main = do
    let result = qsort [1, 3, 2]
    print result
like image 145
bheklilr Avatar answered Oct 08 '22 01:10

bheklilr