Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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
String 如何在Haskell中搜索字符串中的字符串?_String_Haskell - Fatal编程技术网

String 如何在Haskell中搜索字符串中的字符串?

String 如何在Haskell中搜索字符串中的字符串?,string,haskell,String,Haskell,我将如何从Python中实现Haskell等价物 >>> "this is a test".find("test") 10 编辑:基本上我有一些文本,例如:这是一个测试。现在我有一个字符串,我想在该文本中找到,例如:test。如何在这是一个测试中找到测试的字符偏移量 您可以尝试使用和来自数据。列表: 其工作原理如下: *Main> findString "test" "this is a test" Just 10 *Main> findString "blah"

我将如何从Python中实现Haskell等价物

>>> "this is a test".find("test")
10
编辑:基本上我有一些文本,例如:这是一个测试。现在我有一个字符串,我想在该文本中找到,例如:test。如何在这是一个测试中找到测试的字符偏移量

您可以尝试使用和来自数据。列表:

其工作原理如下:

*Main> findString "test" "this is a test"
Just 10
*Main> findString "blah" "this is a test"
Nothing
此外,由于findIndex的类型为:findIndex::a->Bool->[a]->Maybe Int,因此它在这里只返回Int或不返回任何内容。如果不返回任何内容,则未找到子字符串,否则只返回Int。这是Haskell方法,也是这里最常用的返回类型

注意:如果您真的想返回-1,就像pythons方法一样,您可以将上述函数调整为:

import Data.List
import Data.Maybe

findString :: (Eq a) => [a] -> [a] -> Int
findString search str = fromMaybe (-1) $ findIndex (isPrefixOf search) (tails str)
它使用的是来自数据的。可能什么都不转换成-1,只是x转换成x

您可以尝试使用和来自数据。列表:

其工作原理如下:

*Main> findString "test" "this is a test"
Just 10
*Main> findString "blah" "this is a test"
Nothing
此外,由于findIndex的类型为:findIndex::a->Bool->[a]->Maybe Int,因此它在这里只返回Int或不返回任何内容。如果不返回任何内容,则未找到子字符串,否则只返回Int。这是Haskell方法,也是这里最常用的返回类型

注意:如果您真的想返回-1,就像pythons方法一样,您可以将上述函数调整为:

import Data.List
import Data.Maybe

findString :: (Eq a) => [a] -> [a] -> Int
findString search str = fromMaybe (-1) $ findIndex (isPrefixOf search) (tails str)

它使用的是来自数据的。可能什么都不转换成-1,只是x转换成x

如果您想要高速的东西,那么您需要使用文本压缩字节,而不是字符串链接的字符列表。文本还有一个略显隐藏的指示功能,用于以下目的:

Prelude> :set -XOverloadedStrings
Prelude> import Data.Text
Prelude Data.Text> import Data.Text.Internal.Search
Prelude Data.Text Data.Text.Internal.Search> indices "yep" "yep no yes yep"
[0,11]
镜像另一个应答者的命名,并提供一些变体以给出单个数字、匹配索引列表(可能为空)以及可能的版本:

{-# LANGUAGE OverloadedStrings #-}
import Data.Text.Internal.Search
import Data.Text

findString :: Text -> Text -> [Int]
findString = indices

findStringMaybe :: Text -> Text -> Maybe Int
findStringMaybe x str = case indices x str of
                         (idx:_) -> Just idx
                         _ -> Nothing

findStringWithNegOne :: Text -> Text -> Int
findStringWithNegOne x str = maybe (-1) id (findStringMaybe x str)

如果你想要一些高速的东西,那么你需要使用文本压缩字节而不是字符串链接的字符列表。文本还有一个略显隐藏的指示功能,用于以下目的:

Prelude> :set -XOverloadedStrings
Prelude> import Data.Text
Prelude Data.Text> import Data.Text.Internal.Search
Prelude Data.Text Data.Text.Internal.Search> indices "yep" "yep no yes yep"
[0,11]
镜像另一个应答者的命名,并提供一些变体以给出单个数字、匹配索引列表(可能为空)以及可能的版本:

{-# LANGUAGE OverloadedStrings #-}
import Data.Text.Internal.Search
import Data.Text

findString :: Text -> Text -> [Int]
findString = indices

findStringMaybe :: Text -> Text -> Maybe Int
findStringMaybe x str = case indices x str of
                         (idx:_) -> Just idx
                         _ -> Nothing

findStringWithNegOne :: Text -> Text -> Int
findStringWithNegOne x str = maybe (-1) id (findStringMaybe x str)
我是这样做的:

findSubStrIdx :: String -> String -> Integer -> Maybe Integer
findSubStrIdx "" _ _ = Nothing
findSubStrIdx s target n
    | take (length target) s == target      = n
    | otherwise                             = findSubStrIdx (tail s) target (n + 1)
这种方法没有其他一些方法那么抽象,这可能是好的,也可能是坏的,这取决于你是否在写一个库,它还做什么,等等。作为一个新的Haskeller,我发现这种方法比一些更抽象的方法更容易理解。我相信这不会引起任何例外。要启动,请为整数传入0,如下所示:

findSubStrIdx "hi, my name is Joe" "Joe" 0
Just 15
cStyleNegative1 :: Maybe Integer -> Integer
cStyleNegative1 Nothing = -1
cStyleNegative1 (Just x) = x
你应该得到这样的结果:

findSubStrIdx "hi, my name is Joe" "Joe" 0
Just 15
cStyleNegative1 :: Maybe Integer -> Integer
cStyleNegative1 Nothing = -1
cStyleNegative1 (Just x) = x

现在考虑一下你要找的字符串在较长的字符串中不存在的情况:

findSubStrIdx "hi, my name is Joe" "Harry" 0
Nothing
如果你想使用fromMaybe之类的东西,我建议在调用这个函数的任何地方都这样做;这样,您就降低了引发未处理异常的风险。如果你真的想做C-style-1,你可以这样做:

findSubStrIdx "hi, my name is Joe" "Joe" 0
Just 15
cStyleNegative1 :: Maybe Integer -> Integer
cStyleNegative1 Nothing = -1
cStyleNegative1 (Just x) = x
但是,正如其他人所说,我建议远离这种做法

我是这样做的:

findSubStrIdx :: String -> String -> Integer -> Maybe Integer
findSubStrIdx "" _ _ = Nothing
findSubStrIdx s target n
    | take (length target) s == target      = n
    | otherwise                             = findSubStrIdx (tail s) target (n + 1)
这种方法没有其他一些方法那么抽象,这可能是好的,也可能是坏的,这取决于你是否在写一个库,它还做什么,等等。作为一个新的Haskeller,我发现这种方法比一些更抽象的方法更容易理解。我相信这不会引起任何例外。要启动,请为整数传入0,如下所示:

findSubStrIdx "hi, my name is Joe" "Joe" 0
Just 15
cStyleNegative1 :: Maybe Integer -> Integer
cStyleNegative1 Nothing = -1
cStyleNegative1 (Just x) = x
你应该得到这样的结果:

findSubStrIdx "hi, my name is Joe" "Joe" 0
Just 15
cStyleNegative1 :: Maybe Integer -> Integer
cStyleNegative1 Nothing = -1
cStyleNegative1 (Just x) = x

现在考虑一下你要找的字符串在较长的字符串中不存在的情况:

findSubStrIdx "hi, my name is Joe" "Harry" 0
Nothing
如果你想使用fromMaybe之类的东西,我建议在调用这个函数的任何地方都这样做;这样,您就降低了引发未处理异常的风险。如果你真的想做C-style-1,你可以这样做:

findSubStrIdx "hi, my name is Joe" "Joe" 0
Just 15
cStyleNegative1 :: Maybe Integer -> Integer
cStyleNegative1 Nothing = -1
cStyleNegative1 (Just x) = x

但是,正如其他人所说,我建议远离这种做法

有很多boyer moore在Hackage上的实现,我建议你四处看看。如果你不是在寻找像博伊尔·摩尔那样的东西,那么你的问题需要充实。我不知道你在说什么。我只需要从字符串中找到一些文本。Boyer-Moore是CS中通常教授的算法,用于在不到ON*M的时间内找到子字符串的位置,甚至找到子字符串的存在。Hackage上有许多Boyer-Moore实现,我建议您四处看看。如果你不是在寻找像博伊尔·摩尔那样的东西,那么你的问题需要充实。我不知道你在说什么。我只需要从字符串中查找一些文本。Boyer-Moore是CS中通常教授的算法,用于在不到ON*M的时间内查找子字符串的位置,甚至查找子字符串的存在。我强烈反对使用formJust,因为findString no yes***Exception:Maybe.fromJust:Nothing。鉴于python的find方法在不存在时返回-1查找文本时,可以使用:fromMaybe
-1美元findIndex。。。相反或者仅仅公开maybeint并鼓励haskell-y方法。同样值得一提的是Omn,而Python可能有所不同。在Python中返回-1甚至不是一个好主意,它可能不返回任何值或引发异常。这种行为是C语言遗留下来的,最好不要在Haskell中重复。只需返回一个Maybe Int。我强烈反对使用formJust,因为findString no yes***异常:Maybe.fromJust:Nothing。鉴于python的find方法在没有找到文本时返回-1,您可以使用:fromMaybe-1$findIndex。。。相反或者仅仅公开maybeint并鼓励haskell-y方法。同样值得一提的是Omn,而Python可能有所不同。在Python中返回-1甚至不是一个好主意,它可能不返回任何值或引发异常。这种行为是C语言遗留下来的,最好不要在Haskell中重复。只需返回一个整数就可以了。我想知道是否有一种简单的方法可以在没有内部例程的情况下实现这一点。是否有一些公共功能可以做到这一点,这些功能可以在内部实现?我并没有看到。公开一个高效的版本将是一个很好的贡献。我想知道是否有一种不需要内部例程的简单方法来做到这一点。是否有一些公共功能可以做到这一点,这些功能可以在内部实现?我并没有看到。公开一个高效的版本将是一个很好的贡献。