Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何修复此代码?_Haskell - Fatal编程技术网

Haskell 如何修复此代码?

Haskell 如何修复此代码?,haskell,Haskell,我有一些代码执行显式递归,除此之外,它还可以在不需要时调用同一个函数两次。我想我可以解决后者,但前者需要帮助 yesodIdentifier :: Text -> [LDAPEntry] -> Text yesodIdentifier name ((LDAPEntry _ attributes):_) = let (Just eMail) = L.lookup "proxyAddresses" attributes partedEmail = L.map (S.spl

我有一些代码执行显式递归,除此之外,它还可以在不需要时调用同一个函数两次。我想我可以解决后者,但前者需要帮助

yesodIdentifier :: Text -> [LDAPEntry] -> Text
yesodIdentifier name ((LDAPEntry _ attributes):_) =
  let (Just eMail) = L.lookup "proxyAddresses" attributes
      partedEmail = L.map (S.splitOn "@") eMail -- now we have   
                                                -- [["garbage:name","domain"]]
  in yesodIdentifier' name partedEmail -- the secondary function is the problem

     where yesodIdentifier' :: Text -> [[String]] -> Text
           yesodIdentifier' nameToMatch ((name:[domain]):rest) =
             if ((unpack nameToMatch) == (sanitized name))
              then (pack (sanitized name)) `append`
                   (pack "@") `append`
                   (pack domain)
              else yesodIdentifier' nameToMatch rest
             where sanitized :: String -> String
                   sanitized dirty =
                     let (garbage:[cleanedName]) = S.splitOn ":" dirty
                     in cleanedName
           yesodIdentifier' name _ = pack "empty identifier"
我试图做的是从LDAPEntry中获取(字符串,[String]),并将其缩减为与给定名称匹配的电子邮件地址

您可以看到递归的位置。如果我能解决这个问题,我就不必担心
yesodIdentifier'name\uux=pack“empty identifier”
,因为如果用户不在LDAP数据库中,就不会调用此代码。我只是把它放在那里完成。
我认为这是一个更好的表达方式,但我不能完全正确地表达在我的脑海中。有什么想法吗?

这可以表示为一个过滤器。这不是一个折叠,因为,如果你真的递归,你是在rest上递归,并丢弃了前面的条目。您仍然需要处理空列表:

yesodI nameToMatch list = let result = filter (match(unpack nameToMatch)) list match s1 (s2:[domain]) = s1 == s2 in case result of [] -> "empty identifier" res -> repack (head res) repack arg@(name:[domain]) = (pack (sanitized name)) `append` (pack "@") `append` (pack domain) yesodI名称匹配列表=让结果=筛选(匹配(解包名称匹配))列表 匹配s1(s2:[域])=s1==s2 万一结果 []->“空标识符” res->重新打包(头部res) 重新打包arg@(名称:[域])=(打包(净化名称))`append` (pack“@”)`附加` (包域)
您可以先清理
(名称、域)
对的电子邮件地址,使用
查找
找到第一个名称匹配的电子邮件地址,然后
也许
决定如果您找到/没有找到匹配的电子邮件地址,该怎么办:

yesodIdentifier :: Text -> [LDAPEntry] -> Text
yesodIdentifier name ((LDAPEntry _ attributes):_) =
  let (Just eMail) = L.lookup "proxyAddresses" attributes
      name' = T.unpack name
      sanitizedEmail = concatMap sanitize eMail -- now we have [("name","domain")]
      empty = "empty identifier"
      nonEmpty (name, domain) = concat [name, "@", domain]
      sanitize s = do
        (dirtyName:[domain]) <- [S.splitOn "@" s]
        (garbage:[cleanedName]) <- [S.splitOn ":" dirtyName]
        return (cleanedName, domain)
  in T.pack . maybe empty nonEmpty . L.find ((name' ==).fst) $ sanitizedEmail
yesodIdentifier::Text->[LDAPEntry]->Text
yesodIdentifier名称((LDAPEntry属性):\=
let(仅电子邮件)=L.查找“proxyAddresses”属性
名称'=T.unpack名称
sanitizedmail=concatMap sanitize eMail——现在我们有了[(“名称”、“域”)]
empty=“空标识符”
非空(名称,域)=concat[名称,@,域]
消毒s=do

(dirtyName:[domain])来自ja的答案,重写为使用find:

yesodI name l = intercalate "@" <$> (find ((name ==) . head) $ filter (not . null) l)
yesodI name l=插入“@”(find((name==).head)$filter(not.null)l)
更具可读性的版本

yesodI name list = repack <$> find matchName list'
 where list' = filter (not . null) list
       repack = intercalate "@"
       matchName = (name ==) . head
yesodI名称列表=重新打包查找匹配名称列表'
其中列表“=筛选器(非.null)列表
重新包装=插入“@”
匹配名称=(名称==)。头

您可以通过添加
{-#LANGUAGE OverloadedStrings}
来避免
打包“…”
,然后您可以只使用
“…”
。我不理解as模式的用法,因为我没有看到右侧的
arg
。“as模式”-您不理解它,因为它是非感官的,也就是说,不需要它。让我们将该行改写为:“重新打包(名称:[域]=…”。感谢您指出。find会更好,因为他只需要第一次匹配。您是否阅读了我们关于多余的
as
绑定的小讨论?是的,我没有触及重新打包功能,因为它实际上没有更改。但是我同意,arg@是冗余的。我删除了macth函数。删除了repack函数。现在它是一条单行线。:)