【问题标题】:haskell if true then break or continue loophaskell 如果为真则中断或继续循环
【发布时间】:2014-07-08 11:30:29
【问题描述】:

我对 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

如果第一个匹配项为真,它应该可以工作,但如果不是,我怎样才能让它继续到列表中的下一个?

提前致谢

【问题讨论】:

  • Just 中返回参数似乎很奇怪——调用者已经知道test 是什么,那为什么还要返回呢?
  • 这只是一个理论问题。我打算稍后在 Just 中归还其他东西。
  • otherwise = Nothing 的情况看起来不对。如果x 不是test 的中缀,则需要递归检查xs

标签: haskell functional-programming


【解决方案1】:

让我音译你的代码:

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

但你想要的是

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

还有

如果列表为空,则什么都找不到,所以返回Nothing

这对你有帮助吗?

【讨论】:

  • 这就是我想要做的。我应该第一次就这样解释。作为haskell的新手,我不知道如何测试它是否不返回任何内容然后自己回忆。
  • 你有“else abort”。你需要“用更小的列表调用同样的东西”。这里有什么大挑战?您是否对如何调用您的函数有疑问,或者是否确定较小的列表是什么?
  • @Sarah 请注意,Joachim 对您问题的重新措辞几乎直接转化为 Haskell。尝试按照此提示调整您的代码。
  • 致反对者:请始终说明您反对某个问题或答案的原因。
【解决方案2】:

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

来自Data.List 的函数find 正是这样做的:

isMatch xs test = find (`isInfixOf` test) xs

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

如果您坚持在结果中包含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 的返回值;也许findMatch 会更好。

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多