Haskell过滤器选项连接

kil*_*tek 2 parsing haskell concatenation filter

exchangeSymbols "a§ b$ c. 1. 2. 3/" = filter (Char.isAlphaNum) (replaceStr str " " "_")
Run Code Online (Sandbox Code Playgroud)

上面的代码应该首先用""替换所有"空格_",然后按照过滤字符串Char.isAlphaNum.不幸的是,这Char.isAlphaNum部分吸收了已经交换的"_",这不是我的意图,我想持有" _".所以,我认为只需在过滤器中添加一个例外就好了:

exchangeSymbols "a§ b$ c. 1. 2. 3/" = filter (Char.isAlphaNum && /='_') (replaceStr str " " "_")
Run Code Online (Sandbox Code Playgroud)

你看到添加了&& not /='_'.它产生了一个parse error,显然连接过滤器选项并不是那么容易,但有一个聪明的解决方法吗?我想过包装过滤器功能,就像每次递归1000次左右一样,添加一个新的过滤器测试(/='!'),(/='§')等等而不添加(/='_').然而,它似乎不是一个方便的解决方案.

phy*_*nfo 6

写作

... filter (Char.isAlphaNum && /='_') ...

实际上是一个类型错误(它产生解析错误的原因可能是您使用/ =作为前缀 - 但它是一个中缀运算符).不能合并功能(&&)自其针对布尔(不是函数)的运营商.

实际上,这段代码应该是:

... filter (\c -> Char.isAlphaNum c && c /= '_') ...

  • 将`&&'更改为`||`,将`/ =`更改为`==`它应该可以正常工作,因为你想要那些_either_alphanumeric _或_下划线. (3认同)