Существует много способов сделать это, но поскольку вы упоминаете, что вы новичок в Haskell, понимание списка может быть проще всего понять (я предполагаю, что это домашнее задание, поэтому вы должны реализовать его самостоятельно, а не использовать 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]
Здесь мы zip
строка str
с бесконечным списком, начиная с 0, производя кортежи ('h', 0), ('a', 1), ('s', 2)
и т.д. затем мы выбираем только кортежи, где символ (связанный с x
) равен аргумент ch
и вернуть индекс (привязанный к y
) для каждого из них.
Если вы хотите сохранить текущий порядок аргументов, но использовать elementIndices
вы можете использовать следующее:
stringCount' = flip elemIndices
stringCount' "haskell is hard" 'h'
-- [0,11]
Большое спасибо Michael Kohl и как я могу сделать это с elemIndex? – Diana
Извините, это 'elemIndices', а не' elemIndex' (последний дает вам только индекс первого вхождения). 'elemIndices 'a' 'haskell is hard'' дает желаемый результат, поэтому вам просто нужно перевернуть порядок аргументов. –