haskell如果为true则断开或继续循环

时间:2014-05-20 09:22:14

标签: haskell functional-programming

我对Haskell相当新鲜。

我想传递两个项目:

首先是字符串说明["1","2","3","4"]的数字列表,我想知道这些项目中是否每个都以随机字符串形式显示"14321"

例如myFunction ["6","2","3"] "1234"

我的返回值将是一个类型,我想返回Just("the number found", "14321")。 第一个返回参数将是列表中找到的数字,第二个是最初传递的字符串。

问题是,我只想将匹配的第一个实例作为一个可能返回,如果没有匹配则不返回。

我不确定如何进行这样的循环,检查是否匹配,如果是,则返回并完成或继续进入列表中的下一个项目。

我有这个:

isMatch :: [String] -> String -> Maybe (String,String)
isMatch (x:xs) test | x `isInfixOf` test = Just (x, test)
                    | otherwise = Nothing

如果第一个匹配为真,它应该有效,但如果没有,我怎样才能让它继续到列表中的下一个匹配?

提前致谢

2 个答案:

答案 0 :(得分:3)

让我音译您的代码:

  

如果找到列表中的第一个元素,则返回它。否则中止。

但你想要的是

  

如果找到列表中的第一个元素,则返回它。否则做同样的事情,但只有列表的其余部分。

  

如果列表为空,则无法找到任何内容,因此请返回Nothing

这对你有帮助吗?

答案 1 :(得分:3)

  

问题是,我只想将匹配的第一个实例作为一个可能返回,如果没有匹配则返回任何内容。

来自find的{​​{1}}函数正是这样做的:

Data.List

这给出了一个很简洁的定义,但是如果你正在学习Haskell,你应该试着弄清楚如何使用显式递归来编写版本。

如果您坚持在结果中加入isMatch xs test = find (`isInfixOf` test) xs ,则可以使用test修改fmap值:

Just

或使用isMatch xs test = fmap (\x -> (x, test)) $ find (`isInfixOf` test) xs 扩展程序:

TupleSections

但是使用isMatch xs test = fmap (, test) $ find (`isInfixOf` test) xs 之类的名称,我实际上会期望isMatch返回值;也许Bool会更好。