toasttoast
toasttoast

Reputation: 5

counting lower and uppercase characters in haskell

Im a beginner to haskell and I've tried to create a function which counts the numbers of a character in a string. The problem I have is that I am only able to count either the number of occurences of a uppercase or a lowercase character. I want to count both of them. E.g. For the string Mum the result for counting m should be 2.

My function right now looks like this:

import Data.Char
countList :: [Char] -> Char -> Int
countList str c = length $ filter (== c) str

What would your suggestions on solving this be?

Upvotes: 0

Views: 2128

Answers (3)

Netwave
Netwave

Reputation: 42716

Just transform all to lowercase:

import Data.Char
countList :: [Char] -> Char -> Int
countList str c = length $ filter (== toLower c) $ map toLower str

You can also use just use fold, here a ghci example:

Prelude Data.Char> let countList = \str c -> foldl (\x y -> x + if ((toLower y) == (toLower c)) then 1 else 0) 0 str
Prelude Data.Char> countList "AAaabCC" 'a'
4

Upvotes: 1

leftaroundabout
leftaroundabout

Reputation: 120711

A neat way to obtain the toUpper c == toUpper char comparison is to use the on combinator:

import Data.Function

countChar char = length . filter (on (==) toUpper char)

Upvotes: 1

ƛƛƛ
ƛƛƛ

Reputation: 892

import Data.Char (toUpper)

countChar :: Char -> [Char] -> Int
countChar char  = length . filter (\c -> toUpper c == toUpper char)


countChar 's' "Stdudents" => 2
countChar 'S' "Sstudents" => 3
countChar 'S' "$tudent$$" => 0

Given a character 'char', filter the entire string for any character whose uppercase matches the uppercase of 'char'. Feed the new filtered string to the 'length' function to get the total count.

Upvotes: 1

Related Questions