【问题标题】:Haskell String substring functionHaskell 字符串子字符串函数
【发布时间】:2013-11-17 23:20:47
【问题描述】:

我的函数接受 2 个字符串并确定第一个字符串是否是第二个输入字符串的子字符串。例如:

isSubb "abc" "abcmhk" -- True
isSubb "abc" "uyabcmhk" -- True
isSubb "abc" "okaibcmhk" -- False
isSubb "abc" "amnabkaaabcmhk" -- gives True

到目前为止我有:

isSubb :: [Char] -> [Char] -> Bool
isSubb sub str = auxx sub sub str

auxx :: [Char] -> [Char] -> [Char] -> Bool
auxx safe (s:ub) (st:r)
| s:ub == []    = True
| st:r == []  = False
| s == st   = auxx safe ub r
| otherwise  = auxx safe safe r

但它给了我一个关于auxx 函数的非详尽错​​误。

非常感谢任何帮助! 谢谢!

【问题讨论】:

  • 有点吹毛求疵:您正在寻找子字符串(或子列表),而不是子集。因为“abc”肯定是“axbycz”的子集,不是吗?
  • 好点。我会编辑

标签: string function haskell substring


【解决方案1】:

您的auxx 函数需要考虑第二个或第三个参数为[] 的情况(因为您正在到达那里)。

s:ub == []st:r == [] 永远不会是 True,因为模式匹配发生在保护评估之前。

你的功能的一个理智的等价物是

auxx safe sub str
  | sub == [] = True
  | str == [] = False
  | head sub == head str = auxx safe ub r
  | otherwise = auxx safe safe r

虽然上述方法效率不高,因为它可以通过模式匹配来改进。

auxx _ [] _ = True
auxx _ _ [] = False
auxx safe (s:ub) (st:r)
  | s == st = auxx safe ub r
  | otherwise = auxx safe safe r

【讨论】:

  • 谢谢!这很好用!我试图找出类似的东西,但不知道你可以使用_
  • _ 代表任何东西,您可以在其中放置一个变量名,它将进行模式匹配和绑定,但使用 _ 是可取的,因为不会发生模式匹配和变量绑定 - 它只是被丢弃.
【解决方案2】:

Data.List 中有isInfixOF 函数。

isInfixOf :: Eq a => [a] -> [a] -> Bool

isInfixOf 函数接受两个列表并返回True,前提是第一个列表完整且完整地包含在第二个列表中的任何位置。

Prelude Data.List> isInfixOf "abc" "abcmhk"
True
Prelude Data.List> isInfixOf "abc" "uyabcmhk"
True
Prelude Data.List> isInfixOf "abc" "okaibcmhk"
False
Prelude Data.List> isInfixOf "abc" "amnabkaaabcmhk"
True

你可以像这样写你的函数

import Data.List (isInfixOf)

isSubb :: [Char] -> [Char] -> Bool
isSubb sub str = isInfixOf sub str

【讨论】:

    【解决方案3】:

    你的定义不正确!

     | s == st   = auxx safe ub r
    

    带来问题。看,确定 "abc" 是否在 "afkjskgsbc" 中与确定 "bc" 是否在 "fkjskgsbc" 中是不一样的。因此,您需要考虑第一个字母可能是也可能不是您要查找的字符串的一部分。

    【讨论】:

    • 这并不能解决他的错误信息。而且,你看过他的例子吗?
    • 你是对的,我的回答没有帮助,他已经有一个正确的测试用例要检查。对不起!
    • 另外你说的是你的答案中的问题不是问题。查看otherwise 分支
    猜你喜欢
    • 2014-02-16
    • 2015-04-02
    • 2021-10-15
    • 2014-02-13
    • 1970-01-01
    • 2018-07-07
    • 2011-10-01
    • 2012-01-06
    • 2021-10-18
    相关资源
    最近更新 更多