Fred Park
Fred Park

Reputation: 33

Defining a length function using tail

I'm pretty new to Haskell and I am trying to define my own length function as follows:

lengthz :: [a] -> a lengthz [] = 0 lengthz n = 1 + length (tail n)

Why does this not compile? And or, is there something wrong with my logic?

Thanks!

Upvotes: 3

Views: 79

Answers (2)

AlexJ136
AlexJ136

Reputation: 1282

The type for your lengthz function is [a] -> a.

This means you're taking a list of a things and returning a single a thing. What if you had a list of Bool? You don't want the function to output a Bool. You want an Int to be returned, regardless of the type of the thing in the list.

The simplest fix would be to change the type of lengthz to [a] -> Int. This says that the argument can be a list of anything (a is the anything, [] says it's a list) and the return type is an Int.

Upvotes: 3

mnoronha
mnoronha

Reputation: 2625

First, you have a typo in your recursive call to lengthZ. Fixing this, we encounter a new type error:

No instance for (Num a)

What this tells us is that in order to use the function (+), we must include the typeclass Num as a constraint in our type declaration. We also include a different type variable for the elements of the list so that the function can be applied to lists containing elements of any type. We thus rewrite the function as follows:

lengthz :: Num b => [a] -> b
lengthz [] = 0
lengthz n = 1 + lengthz (tail n)

Which works just as we'd expect:

ghci>> lengthz [1,2,3]
3
ghci>> lengthz []
0

Upvotes: 5

Related Questions