具有haskell中的多参数函数的延迟过滤器

Bin*_*ang 1 haskell functional-programming

我正在编写一个删除json字符串中的空格的函数.我需要知道我正在处理的当前字符是否被包围",或者它是否在转义字符之后\.所以我需要两个param用于此功能.

这是当前的实现.但我不认为这是懒惰的.如何在json字符串上使用"filter"或"map"使其变得懒惰?

compressJson :: String -> String
compressJson json = compress json False False ""
    -- compress params: json, inStr, aferEscape, acc
    where compress []          _     _     acc = acc
          compress ('\"' : xs) inStr False acc = compress xs (not inStr) False (acc ++ "\"")
          compress ('\\' : xs) inStr False acc = compress xs inStr       True  acc
          compress (x    : xs) inStr True  acc = compress xs inStr       False (acc ++ ['\\', x])
          compress (x    : xs) True  False acc = compress xs True        False (acc ++ [x])
          compress (x    : xs) False _     acc = compress xs False       False (acc ++ parse x)

          parse c = if c `elem` " \t\n"
              then []
              else [c]
Run Code Online (Sandbox Code Playgroud)

Car*_*arl 9

这实际上是微不足道的懒惰 - 不要让它尾递归.

或多或少这样(我没有测试过)

compressJson :: String -> String
compressJson json = compress json False False
    -- compress params: json, inStr, aferEscape
    where compress []          _     _     = ""
          compress ('\"' : xs) inStr False = '\"' : compress xs (not inStr) False
          compress ('\\' : xs) inStr False = compress xs inStr True
          compress (x    : xs) inStr True  = '\\' : x : compress xs inStr False
          compress (x    : xs) True  False = x : compress xs True False
          compress (x    : xs) False _     = parse x ++ compress xs False False

          parse c = if c `elem` " \t\n"
              then []
              else [c]
Run Code Online (Sandbox Code Playgroud)

尾递归和懒惰是彼此直接的可能性.尾递归意味着函数是使用修改后的参数调用自身.懒惰意味着它会立即返回一个构造函数(即,不是在一些不确定的递归调用之后).因此,如果您希望函数是惰性的,请将其写入以立即返回部分结果.