【发布时间】:2014-10-23 13:41:57
【问题描述】:
我想做一个函数,当给定一个字符串时,例如“ab”和“cdabd”,当它将用于这两个字符串时,它将输出“cd”
到现在为止
takeUntil :: String -> String -> String
takeUntil [] [] = []
takeUntil xs [] = []
takeUntil [] ys = []
takeUntil xs ys = if contains xs ys then -- ???? I get stuck here.
包含函数是我之前定义的函数(整个函数应该不区分大小写) 包含函数:
contains :: String -> String -> Bool
contains _ [] = True
contains [] _ = False
contains xs ys = isPrefixOf (map toLower ys) (map toLower xs) || contains (tail(map toLower xs) (map toLower ys)
【问题讨论】:
-
你的定义有点错误,你的意思是最后4行的
takeUntil吗? -
是的,我做到了。应该是 takeUntil
-
另外,如果您可以发布
contains的代码,或者至少发布类型签名和更具体的功能描述,那将非常有帮助。 -
我猜我可能需要一个辅助函数来定义如果 xs 在 ys 中会发生什么。辅助函数应该在两个字符串匹配之前切断所有内容,即 "ab" "cdab" = "cd"
-
有很多方法可以解决这个问题,但我认为使用
contains会让事情变得困难。一方面,如果我传入takeUntil "ab" "abcdab"会怎样?使用contains,这将返回""而不是"cdab"。正如@JosEdu 所做的那样,直接使用isPrefixOf会是更好的选择。