Haskell将空字符传递给函数

时间:2014-08-12 18:52:21

标签: string haskell char

我在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

你能给我一些建议吗?

3 个答案:

答案 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