[SOLVED] Empty list in Haskell is not running in function even though I have a base case checking for empty lists

Issue

This Content is from Stack Overflow. Question asked by Julia Navarro

    -- quick sort a list in Haskell
qsort :: Ord a => [a] -> [a]  
-- check to see if the list is empty
qsort [] = []
-- if the list is  not empty split the list by the head/first element and the rest of the list...
qsort (x:xs) = 
  -- create one list for the smaller elements in the list that will use quick sort recursively
  let small = qsort [a | a <- xs, a <= x]
      --create one list for the larger elements in the list that will use quick sort recursively
      big = qsort [a | a <- xs, a > x]
  -- return the combined lists of the smaller elements list with the original head of the list with the bigger elements list
  in small ++ [x] ++ big

list1 = [5, 6, 2, 3, 7, 4, 6, 2, 7, 4]
list2 = [5, 6, 2, 3, 6, 0, 3, 9, 8, 0]
liste = []
list3 = [-4, 5, -8, 0, -3, 2 ,4]

main:: IO ()

main = 
  do
    print(qsort list1)
    print(qsort list2)
    print(qsort list3)
    print(qsort liste)

The error I keep getting is:

Main.hs:29:11: error:
• Ambiguous type variable ‘a0’ arising from a use of ‘qsort’
prevents the constraint ‘(Ord a0)’ from being solved.
Probable fix: use a type annotation to specify what ‘a0’ should be.
These potential instances exist:
instance Ord Ordering — Defined in ‘GHC.Classes’
instance Ord Integer
— Defined in ‘integer-gmp-1.0.3.0:GHC.Integer.Type’
instance Ord a => Ord (Maybe a) — Defined in ‘GHC.Maybe’
…plus 22 others
…plus four instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In the first argument of ‘print’, namely ‘(qsort liste)’
In a stmt of a ‘do’ block: print (qsort liste)
In the expression:
do print (qsort list1)
print (qsort list2)
print (qsort list3)
print (qsort liste) | 29 | print(qsort liste) | ^^^^^^^^^^^ Failed, no modules loaded.  :1:1: error:
• Variable not in scope: main
• Perhaps you meant ‘min’ (imported from Prelude)



Solution

The type needs to be disambiguated with an explicit signature:

liste :: [Integer]
liste = []
list1 = [5, 6, 2, 3, 7, 4, 6, 2, 7, 4]
list2 = [5, 6, 2, 3, 6, 0, 3, 9, 8, 0]
list3 = [-4, 5, -8, 0, -3, 2 ,4]


This Question was asked in StackOverflow by Julia Navarro and Answered by Julia Navarro It is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.

people found this article helpful. What about you?