There are many ways to do this, but since you mention you’re a Haskell beginner, a list comprehension may be easiest to understand (I’m assuming this is homework, so you have to implement it yourself, not use elemIndices
):
stringCount str ch = [ y | (x, y) <- zip str [0..], x == ch ]
stringCount "haskell is hard" 'a'
-- [1,12]
stringCount "haskell is hard" 'h'
-- [0,11]
Here we zip
, the string str
with the infinite list starting from 0, producing the tuples ('h', 0), ('a', 1), ('s', 2)
, etc. We then only select the tuples where the character (bound to x
) equals the argument ch
and return the index (bound to y
) for each of them.
If you wanted to keep your current argument order but use elementIndices
you can use the following:
stringCount' = flip elemIndices
stringCount' "haskell is hard" 'h'
-- [0,11]
2
solved How to find occurrences of char in an input string in Haskell