String Haskell将空字符传递给函数

String Haskell将空字符传递给函数,string,haskell,char,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 = tra

我在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) 
我的问题是当我尝试时:
在“l”之前的“luis”

答案是:
'
(当然,在
'l'
之前什么都没有),我想成为
'
什么都没有

我尝试传递
trackelement x''str
而不是
trackelement x''str
,但在''str上出现了此错误
语法错误


你能给我提些建议吗?

你可以用
或者

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
为了处理“l”luis“
之前的角落案例
,我们必须添加一个新的初始化器函数。它基本上检查第一个字符是否与搜索的字符匹配。如果是,则返回
Nothing
,因为我们检查了第一个字符,该字符显然没有前一个字符。否则我们只调用
trackelement
,并使用它的结果


正如Zeta所提到的,你可以将这些功能结合起来,从而简化了一切,并解决了你目前遇到的困境

before _ [x] = Nothing
before a (x:y:xs)
  | a == y = Just x
  | otherwise = before a (y:xs)

仅使用此函数时,您注意到遇到包含多个字母的单词时也会遇到问题,这些字母也会被搜索(
在“a”之前的“amalia”
->
只是“m”
)。目前,我所知道的最好的解决方案是再次将其拆分为多个函数,这使我们回到顶部的解决方案。

将前两个元素匹配,而不是直接匹配。这样,您甚至不需要
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

上面给出的答案对于让代码正常工作很有帮助,但它们并不能解释为什么会出现错误。显示该错误的原因是
'
不是有效的语法,因为不存在“空字符”这类东西。所有字符都有值,但
String
s可以为空。请记住
type String=[Char]
,很明显,可以有空列表之类的东西,但字符总是有值的。这相当于说你可以有一个空的
Int
列表,即
[]
,但你不能有一个“空Int”,不管这意味着什么。

我尝试过你的解决方案,但结果是
只有'l'
只有'
我只需要
'l'
'
。我从来没有与
Maybe
@LuisArmando合作过。问题是一开始就给出了可能的匹配。像Zeta那样组合函数是最好的做法。我会在
之前的
中为空列表添加一个案例。事实上,问题是经过编辑的,在我们写答案时问题不在那里^^“@Zeta啊,我没有意识到。不管怎样,我只是想看看它的地址。就我个人而言,我认为你的答案提供了获得一个工作算法的最佳解决方案(ThreeFx’s很好,但相比之下有点长),我只是想涵盖所有的基础,以便OP更全面地了解发生了什么。你的答案工作不正常,我在“a”之前尝试了
“amalia”
而响应是
只是'm'
。这是错误的,因为它必须与第一个
'a'
匹配,而不是与最新的;)@LuisArmando`` Just'm``是中间的
'a'
^^^发生这种情况是因为检查开始得太晚。我认为您应该区分第一个字符上的匹配和完全不匹配,这可能是单个
无法完成的<代码>可能(可能是字符)
数据之前=Nomatch | First |字符之前
可以。一旦区分了这些情况,就应该更清楚地知道如何在
之前实施