使用Head和Tail关联两个字符串的Haskell程序

使用Head和Tail关联两个字符串的Haskell程序,haskell,Haskell,我需要确定一个字符串是否是另一个字符串的子字符串。 我想是比较一个字符串的头与头和另一个字符串,然后是尾的头等等。但是我需要比较supossed子字符串的每个元素与另一个字符串,然后我认为需要借助函数映射。但是我不知道如何编写程序。使用: 导入数据列表(isInfixOf) 导入系统(getArgs) main=do[针,干草堆][a]>Bool someFunction针草垛=所有(`elem`haystack)针 main=do[needle,haystack]如果您试图实现一个子字符串函数

我需要确定一个字符串是否是另一个字符串的子字符串。 我想是比较一个字符串的头与头和另一个字符串,然后是尾的头等等。但是我需要比较supossed子字符串的每个元素与另一个字符串,然后我认为需要借助函数映射。但是我不知道如何编写程序。

使用:

导入数据列表(isInfixOf) 导入系统(getArgs) main=do[针,干草堆][a]>Bool someFunction针草垛=所有(`elem`haystack)针
main=do[needle,haystack]如果您试图实现一个
子字符串
函数,那么下面是我的尝试:

subString :: String -> String -> Bool
subString xs [] = True
subString [] _ = False
subString (x:xs) (y:ys)
  | x == y = ys == take (length ys) xs
  | otherwise = subString xs (y:ys)
示例:

*Main> subString "MarcoS" "arc"
True
*Main> subString "MarcoS" "marc"
False
*Main> subString "MarcoS" ""
True
*Main> subString "" "a"
False
*Main> containsAll "pippo" "pppp"
False
*Main> containsAll "pippo" "ppp"
True
*Main> containsAll "pippo" "ppi"
True
*Main> containsAll "pippo" "ipp"
True
*Main Data.Set> "ppp" `allIn` "pippo"
True
*Main Data.Set> "ipp" `allIn` "pippo"
True
*Main Data.Set> "pppp" `allIn` "pippo"
True
我意识到这不是使用头和尾,但我会这样做


编辑

在看了之后(如所建议的,我意识到有一种简洁的方法和更通用的方法,使用
尾部
…一个人永远不会停止学习:)


编辑2

从评论中我了解到,这个问题实际上要求检查一个字符串是否以任何顺序包含另一个字符串的所有字母,或者更一般地说,一个元素列表是否以任何顺序包含另一个列表的所有元素。下面是我的实现:

import Data.List

-- does xs containsAll ys? containsAll xs ys
containsAll :: (Eq a) => [a] -> [a] -> Bool
containsAll _ [] = True
containsAll [] _ = False
containsAll xs ys = elem ys $ concatMap (permutations) (subsequences xs)
示例:

*Main> subString "MarcoS" "arc"
True
*Main> subString "MarcoS" "marc"
False
*Main> subString "MarcoS" ""
True
*Main> subString "" "a"
False
*Main> containsAll "pippo" "pppp"
False
*Main> containsAll "pippo" "ppp"
True
*Main> containsAll "pippo" "ppi"
True
*Main> containsAll "pippo" "ipp"
True
*Main Data.Set> "ppp" `allIn` "pippo"
True
*Main Data.Set> "ipp" `allIn` "pippo"
True
*Main Data.Set> "pppp" `allIn` "pippo"
True
可能还有其他(更好的)方法,我很想了解:)


编辑3

从其他注释中,我了解到问题本质上是子集检查,即检查一个字符串的所有字母是否也在另一个字符串中。因此,这里有一种方法:

-- are all xs in ys? allin xs ys
allIn :: (Eq a) => [a] -> [a] -> Bool
allIn xs ys = and $ map (flip elem ys) xs
或者,可以使用以下方法:

示例:

*Main> subString "MarcoS" "arc"
True
*Main> subString "MarcoS" "marc"
False
*Main> subString "MarcoS" ""
True
*Main> subString "" "a"
False
*Main> containsAll "pippo" "pppp"
False
*Main> containsAll "pippo" "ppp"
True
*Main> containsAll "pippo" "ppi"
True
*Main> containsAll "pippo" "ipp"
True
*Main Data.Set> "ppp" `allIn` "pippo"
True
*Main Data.Set> "ipp" `allIn` "pippo"
True
*Main Data.Set> "pppp" `allIn` "pippo"
True

也许你会对
数据中的
(\\)
功能感兴趣。List

子字符串““a”
应该是
真的
@MarcoS-感谢你发布了这个源代码链接,它当然是
尾部
的巧妙用法,但它如何比任何其他用法“更通用”?你是说
tail
vs
tails
?但是如果子字符串的元素不在字符串的同一序列中怎么办?马科斯先生car@julia:我已编辑我的答案以回应您的评论:请参阅编辑2@jon_darkstar:我的意思是“比我的实现更一般”:@julia你想说什么?有趣,但是我理解,只有在子串的元素遵循字符串元素的序列的情况下,这个函数IsFixFoT才会有用。例如,如果MyScord=(a,b,c,d,e,)和MySysLeun[=,b,d],子串不是固定的,不是前缀,它也不是整个中间。但是子sting的元素在字符串中。那么怎么办呢?为此,我试图使用isEqual、head and tail和map测试字符串的每个元素,但我做不到。要么我误解了您想要什么,要么您误解了isInfixOf的功能
“bcd”`isInfixOf`“abcde”
为真<代码>“bd”`isInfixOf`“abcde”为False。我以为那就是你想要的。这就是你想要的吗?如果希望
“bd”`someFunction`“abcde”
返回True,那么希望
“db”`someFunction`“abcde”
返回什么?您希望“cc”`someFunction`“abcde”返回什么?当“bd”
isInfixOf
为False时,“abcde”表示bd不是字符串abcde的子字符串(因为函数
isInfixOf
将子字符串作为一个整体进行测试,而c介于两者之间),但bd是abdce的子字符串,因为子字符串的元素在字符串中。如果一个字符串(子字符串)的元素在另一个字符串中,我需要检查string@julia:通常,术语“子字符串”指的是一个连续的子序列,它似乎不是您想要的。也许您可以编辑您的问题,以澄清您想要实现的确切行为?