我对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
如果第一个匹配为真,它应该有效,但如果没有,我怎样才能让它继续到列表中的下一个匹配?
提前致谢
答案 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
会更好。