2016-10-12 1 views
0

Я повторяю список [Char], мне интересно, как лучше всего выполнить итерацию.Итерация с использованием счетчиков в функциональном программировании?

Эта функция вызывает себя рекурсивно и возвращает обратно к себе счетчик, который уменьшается на каждую итерацию.

Его только для иллюстративных целей, так что всегда возвращает истину для каждого Char:

text = ["abcsdsdsdsd"] 

exampleFunction :: Int -> String -> [Bool] 
exampleFunction textlen text 
    | textlen >= 0  = True : exampleFunction (textlen - 1) text 
    | otherwise = [] 

Использование «textlen» как счетчик кажется довольно важно, это лучший способ и/или наиболее Haskell, как в реализовать это?

+0

В зависимости от вашей цели. Например, если у вас есть список Ints и вы хотите получить результат из него, вы можете использовать fold. Или, если вы хотите применить функцию к каждому элементу списка, вы можете использовать карту или обобщенную, которую вы можете применить к типу данных Haskell, например, «Возможно», и тому подобное, и т. Д. Вы можете использовать fmap. Взгляните на класс типа Functor. Functor предназначен для тех типов данных, которые могут быть сопоставлены по тому, какой список является одним из типов данных. На основе вашего примера вы можете, например, использовать map \ _ -> True yourlist – Ch0k0l8

+1

'' abcsdsdsdsd '' эквивалентно '['a', 'b', 'c', 's', 'd', 's' , 'd', 's', 'd', 's', 'd'] '. – chepner

ответ

2

Счетчик не требуется. Длина списка не особенно важна; вы просто используете его, чтобы определить, является ли список непустым (textlen >= 0) или нет. Вы можете сделать то же самое с помощью сопоставления шаблонов по самому аргументу.

exampleFunction :: [String] -> [Bool] 
exampleFunction (x:xs) = True : exampleFunction xs 
exampleFunction [] = [] 

Как было отмечено в комментарии, эта конкретная схема рекурсии абстрагируется, как функции map:

exampleFunction :: [String] -> [Bool] 
exampleFunction xs = map (const True) xs 

где const True возвращает функцию, которая не возвращает True независимо от того, что ее аргумент. (const True также можно записать в виде выражения явной лямбды (\_ -> True). map применяет эту функцию к каждому элементу xs и объединяет результаты в новый список.

Других схем рекурсии захватить различные стили рекурсии (filter, foldr, и т.д.), так что в то время как всегда можно написать явную рекурсивную функцию, чтобы выполнить свою задачу, вы часто можете избежать этого, используя соответствующую функцию высшего порядка.


Я злоупотребляя термин рекурсии схему немного; map и filter можно рассматривать как особые случаи foldr, что является примером общей схемы рекурсии, известной как катаморфизм .