0

zxcvbnパスワード強度アルゴリズムをHaskellに変換しています。

すべての文字がASCIIであるかどうかをチェックし、ブルートフォース攻撃が可能であることを確認する2つの関数があります。

filterAscii :: [String] -- ^terms to filter
            -> [String] -- ^filtered terms
filterAscii = filter $ all (\ chr -> ord chr < 128)

filterShort :: [String] -- ^terms to filter
            -> [String] -- ^filtered terms
filterShort terms = map fst $ filter long $ zip terms [1..]
  where long (term, index) = (26 ^ length term) > index

これらを1つの関数に構成しました。

filtered :: [String] -- ^terms to filter
         -> [String] -- ^filtered terms
filtered = filterAscii . filterShort

用語がnullでないかどうかを確認するために、3番目のフィルターでこれらを作成する必要があります。

filter (not . null) terms

私はフィルターのチェーンを作成していることに気づきました。フィルター関数のリストを取得し、指定された順序でそれらを構成する単一の関数を作成する方が理にかなっています。

読んだことを思い出すと、これは応用ファンクターの仕事だと思います。これにApplicativeを使用できますか?

フィルタリングする前に、1つのベースのインデックスを持つ各アイテムを処理するfilterShort必要がある関数を処理する方法がわかりません。zip

4

2 に答える 2

3

Endoのラッパーを使用して、次のようData.Monoidに使用できるモノイドインスタンスを取得できます。mconcat

Prelude> :m + Data.Monoid
Prelude Data.Monoid> :t appEndo $ mconcat [Endo filterAscii, Endo filterShort]
appEndo $ mconcat [Endo filterAscii, Endo filterShort] :: [String] -> [String]
于 2012-12-31T16:48:42.720 に答える
2

言い換えれば、あなたは欲しいです:

filters :: [a -> Bool] -> [a] -> [a]
filters fs = filter (\a -> and $ map ($ a) fs)

しかし、とにかく、sのパイプラインはGHCによって最適化される可能性が非常に高いことも知っておく必要がありますfilter(私が知る限り)。したがって、この関数を作成する価値はないかもしれません。filterShort純粋なフィルターではないため、問題が発生する可能性があることに注意してください。

于 2012-12-31T21:14:44.000 に答える