Couldn't match type '[t0 -> t]' -> Bool with Bool

I am a beginner in haskell. I am facing the error that’s in the heading. Below is my haskell code.

member atm lizt = if null lizt
                     then False
                     else if atm == head lizt then True else member(atm (tail lizt))
                     
main = print(member 1 [2, 1])

The error message

    GHCi, version 8.10.6: https://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /home/runner/member/.ghci
[1 of 1] Compiling Main             ( Main.hs, interpreted )

Main.hs:1:1: error:
    • Couldn't match type ‘[t0 -> t] -> Bool’ with ‘Bool’
      Expected type: t -> Bool
        Actual type: (t0 -> t) -> [t0 -> t] -> Bool
    • Relevant bindings include
        member :: t -> Bool (bound at Main.hs:1:1)
  |
1 | member atm lizt = if null lizt
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...

Main.hs:5:14: error:
    • Couldn't match expected type ‘[a1] -> a0’ with actual type ‘Bool’
    • The function ‘member’ is applied to two arguments,
      but its type ‘t1 -> Bool’ has only one
      In the first argument of ‘print’, namely ‘(member 1 [2, 1])’
      In the expression: print (member 1 [2, 1])
  |
5 | main = print(member 1 [2, 1])
  |              ^^^^^^^^^^^^^^^
Failed, no modules loaded.
 
<interactive>:1:1: error:
    • Variable not in scope: main
    • Perhaps you meant ‘min’ (imported from Prelude)
 ^C Leaving GHCi.
repl process died unexpectedly: 
GHCi, version 8.10.6: https://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /home/runner/member/.ghci
 

I am trying to print true if the given integer(atm in my case) is present in the given list else false. The code is working(justing checking with the first element of the list) before I add recursion call. Please help me with this.

>Solution :

I think you have a misconception in how functions are called.

member is a two argument function. It can be called like member atm (tail lizt). When you try to call it like member(atm (tail lizt)), atm (tail lizt) tells it to call atm as a function on tail lizt. But atm isn’t supposed to be a function. What you want is to call member with two arguments atm and tail lizt.

The compiler error you get is not that great. The compiler knows something is wrong, but it doesn’t know exactly what. These sorts of confusing errors happen a lot in Haskell. The best way to approach them is to notice that you have a type error, and then start adding type signatures. If you add the type signature you want for member to your code:

member :: Eq a => a -> [a] -> Bool

Then the compiler has a better idea of what you are trying to do and gives a more helpful answer:

    • Couldn't match expected type ‘Bool’
                  with actual type ‘[a0] -> Bool’
    • Probable cause: ‘member’ is applied to too few arguments
      In the expression: member (atm (tail lizt))
      In the expression:
        if atm == head lizt then True else member (atm (tail lizt))
      In the expression:
        if null lizt then
            False
        else
            if atm == head lizt then True else member (atm (tail lizt))
  |
4 |                      else if atm == head lizt then True else member(atm (tail lizt))
  |                                                              ^^^^^^^^^^^^

It also helps if you just add type signatures to begin with, since they help communicate what your code is supposed to do to other human beings as well.

Leave a Reply