我在Haskell工作有两个功能:
基本上我想在匹配给定字符串中的特定字符之前获取字符
这是我的代码:
before :: Char -> [Char] -> Char
before x str = trackelement x ' ' str
trackelement :: Char -> Char -> [Char] -> Char
trackelement x y (z:zs)
| x == z = y
| otherwise = trackelement x z (zs)
我的问题是当我尝试:before 'l' "luis"
答案是:' '
(当然,在'l'
之前没有任何内容),我希望成为''
或Nothing
我尝试传递trackelement x '' str
而不是trackelement x ' ' str
,但我有这个错误Syntax error on ''str
你能给我一些建议吗?
答案 0 :(得分:4)
显示的答案已经很适合让您的代码正常运行,但他们无法解释您收到错误的原因。显示该错误的原因是''
不是有效的语法,因为没有"空字符"。所有字符都有值,但String
s 可以为空。请记住type String = [Char]
,并且非常清楚可以存在空列表这样的内容,但字符始终具有值。它可以说你可以有一个Int
的空列表,即[]
,但你不能有一个"空int&#34 ;,无论如何意思是。
答案 1 :(得分:3)
您可以使用Maybe
:
before :: Char -> [Char] -> Maybe Char
before x str = initialise x str
initialise x (y:xs)
| x == y = Nothing
| otherwise = trackelement x y xs
trackelement :: Char -> Char -> [Char] -> Maybe Char
trackelement x y [] = Nothing
trackelement x y (z:zs)
| x == z = Just y
| otherwise = trackelement x z zs
要处理角落案例before 'l' "luis"
,我们必须添加新的初始化函数。它基本上检查第一个字符是否与搜索到的字符匹配。如果是,我们返回Nothing
,因为我们检查了第一个显然没有前一个字符的字符。另外,我们只需致电trackelement
并使用它的结果。
正如Zeta所说,你可以结合这些功能,简化一切,并处理你目前遇到的角落情况。
before _ [x] = Nothing
before a (x:y:xs)
| a == y = Just x
| otherwise = before a (y:xs)
只是使用此功能,您发现在遇到包含多个字母的单词时遇到问题,该单词也会被搜索(before 'a' "amalia"
- > Just 'm'
)。目前我所知道的最佳解决方案是再次将其分解为多个功能,这将我们带回到顶部的解决方案。
答案 2 :(得分:3)
匹配前两个元素而不是头尾。这样你甚至不需要trackelement
:
before :: Eq a => a -> [a] -> Maybe a
before x (a:b:rest)
| a == x = Nothing
| b == x = Just a
| otherwise = before x (b:rest)
before _ _ = Nothing