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