如何在Haskell中替换多个案例?

Bra*_*FRZ 3 haskell replace

我写了一个函数,能够清理在Haskell中处理的字数.它需要能够-变成空格(即四十五变成四十五个)并删除所有其他非字母.我可以递归地定义它,但我真的想做一些更清洁的事情.

clean :: String -> String
clean "" = ""
clean ('-':cs) = ' ' : clean cs
clean (c:cs)
    | isLetter c  = c : clean cs
    | otherwise   = clean cs
Run Code Online (Sandbox Code Playgroud)

这导致我定义了一个自定义过滤器,并根据对此答案的注释定义了Data.List.Split的替换,因为我已经在使用Data.List.Split.

clean :: String -> String
clean = filter (\c -> isLetter c || c == ' ') . replace "-" " " . filter (/= ' ')
  where
    replace :: String -> String -> String -> String
    replace old new = intercalate new . splitOn old
Run Code Online (Sandbox Code Playgroud)

这个版本整体上更加混乱.此外,此版本不会删除原始字符串中的空格.是一个不同的约定或内置的东西,允许我这样做,使用干净的单行程?

4ca*_*tle 7

处理列表最强大的功能之一是concatMap(aka >>=).您可以clean像这样编写函数:

clean :: String -> String
clean = concatMap (\c -> if c == '-' then " " else [c | isLetter c])
Run Code Online (Sandbox Code Playgroud)