Вы
search :: String -> Char -> [Int]
search str letter = [ num | (x, num) <- (zip str [0..]), letter == x]
, что это делает он идет по списку ввода символов (строка), а при увеличении значения индекса на 1 для каждого нового персонажа. И при этом он проверяет, совпадает ли символ с указанным, и если да, то он производит его (или, скорее, его индекс).
Таким образом, мы лучше всего моделируем это с помощью защищенной рекурсии, которая позволяет нам производить каждый найденный символ (или его индекс), как только мы его найдем.
search str letter = go str <initial-index-value>
where
здесь мы хозяева нашей области, мы можем, однако, имеют много параметров для нашей внутренней функции мы хотим – мы не ограничены молниях пар, которые диктуются <-
оператором список понимание в. Более того, мы можем рассчитывать сами, создавая новые индексы по мере необходимости.
go [] _ = -- we've reached the end of the input.
-- we should finish up our output
.... -- ok, it's the end of any list - an empty list
go (x:xs) i
| x == letter =
мы имеем доступ к letter
потому что go
внутренняя функция к нашей search
, так что мы можем сравнить их. Здесь мы хотим, чтобы произвести этот показатель сразу
i : <a recursive call with updated parameters>
| otherwise =
ничего производить здесь, просто сделать
<a recursive call to continue the search
on input list's tail, with the new
current index value>
И мы сделали.
Это домашнее задание?Если это все еще разрешено, но лучше всего упомянуть об этом, поэтому ответы будут более сосредоточены на аспекте преподавания, а не на части прямого ответа. –
Это может помочь вам http://stackoverflow.com/questions/14844296/finding-the-index-of-a-given-element-using-tail-recursion –
Это часть моей домашней работы. Приведенный выше код - это то, что я написал – Giovanni