これを行うには多くの方法がありますが、パスを続行して、次のことを試してください。
import Data.List
takeUntil :: String -> String -> String
takeUntil [] [] = [] --don't need this
takeUntil xs [] = []
takeUntil [] ys = []
takeUntil xs (y:ys) = if isPrefixOf xs (y:ys)
then []
else y:(takeUntil xs (tail (y:ys)))
いくつかの出力:
takeUntil "ab" "cdabd"
"cd"
takeUntil "b" "cdabd"
"cda"
takeUntil "d" "cdabd"
"c"
takeUntil "c" "cdabd"
""
takeUntil "xxx" "cdabd"
"cdabd"
編集:
OPは、関数が大文字と小文字を区別しないことを望んでいます。
繰り返しますが、多くの方法でそれを行うことができます。たとえば、次のlowerCase
ような関数を書くことができます (すでに にあると思いますData.Text
):
import qualified Data.Char as Char
lowerCase :: String -> String
lowerCase [] = []
lowerCase (x:xs) = (Char.toLower x):(lowerCase xs)
そして、それを次のように使用します(おそらく醜く、あまり実用的ではありません):
takeUntil (lowerCase "cd") (lowerCase "abcDe")
"ab"
それはあなたが期待する結果です。
lowerCase
また、その関数を内部で使用できますtakeUntil
:
-- ...
takeUntil xs (y:ys) = if isPrefixOf (lowerCase xs) (lowerCase (y:ys))
-- ...
したがって、次のことができます。
takeUntil "cd" "abcDe"
"ab"
とにかく、最良の選択肢は@bheklilrが提案したものだと思います。独自のisPrefixOfCaseless
関数を作成します。
これが役立つことを願っています。