【发布时间】:2012-12-31 16:30:20
【问题描述】:
我正在将 zxcvbn password strength 算法转换为 Haskell。
我有两个函数可以检查所有字符是否为 ASCII 并且是否可以进行暴力攻击:
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
我将它们组合成一个函数:
filtered :: [String] -- ^terms to filter
-> [String] -- ^filtered terms
filtered = filterAscii . filterShort
我现在需要使用第三个过滤器来组合这些以检查术语是否不为空:
filter (not . null) terms
我突然想到我正在创建一个过滤器链,并且创建一个单独的函数来获取过滤器函数列表并按给定的顺序组合它们会更有意义。
如果我从阅读中回忆起,我相信这是一个应用函子的工作。我可以为此使用应用程序吗?
我不确定如何处理 filterShort 函数,我需要在过滤之前将每个项目及其从一开始的索引 zip。
【问题讨论】:
-
为什么现在一切都需要成为应用函子?好老的
foldl (.) id怎么了? -
如何使用它来解决我的问题,尤其是带有索引部分的
zip? -
这个链接
[String]->[String]函数,而不是String->Bool。顺便说一句,ap在这里不好,xs ap ys将每个x应用于每个y。
标签: haskell composition applicative