2016-10-12 23 views
0

私は[Char]のリストを繰り返していますが、私はイテレーションを実行する最善の方法が不思議です。関数型プログラミングでカウンタを使用した反復?

この関数は反復的に自身を呼び出し、反復ごとに減少するカウンタを自身に返します。単に例示的な目的のために

そのため、常に各charの戻り値True:

text = ["abcsdsdsdsd"] 

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

カウンタは、むしろ不可欠と思われるよう「textlen」を使用し、これはするための最良の方法および/または最もHaskellのようなありますこれを実装しますか?

+0

目的に応じて異なります。たとえば、Intsのリストを持っていて、それから結果を取得したい場合、foldを使うことができます。または、リストのすべての要素に関数を適用する場合は、Maybe、EitherなどのHaskellデータ型に適用できるマップまたは一般化されたものを使用できます。fmapを使用できます。 Functorタイプのクラスを見てください。 Functorは、どのリストがデータ型の1つであるかによってマッピングできるデータ型用です。あなたの例に基づいて、例えば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関数として抽象化されていますconst Trueは関係なく、その引数が何であるかTrueを返さない関数を返す

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

。 (const Trueはまた、明示的なラムダ式(\_ -> True)のように書くことができる。mapxsの各要素に、この機能を適用し、新しいリストに結果を組み合わせる。

他再帰スキームは再帰の異なるスタイル(filterfoldrをキャプチャなど)、あなたのタスクを達成するために、明示的な再帰関数を記述することが常に可能である一方、ので、あなたは、多くの場合、適切な高階関数を使って、それを避けることができます。


を私は長期再帰スキームを乱用していますビット; mapおよびfilterは、foldrの特殊ケースと考えることができ、これは、異図形として知られている一般的な再帰スキームの例です。

関連する問題