我正在尝试创建一个从字符串中删除每个第 n 个元素的函数。
dropEvery :: String -> Int -> String
dropEvery str n = map (\(char, indx) -> if indx `mod` n /= 0 then char else ' ') (zip str [1..])
现在它只是用空格替换每个第 n 个元素,但是如果我希望它返回一个“空字符”,我应该在“else”之后放置什么。我知道 Haskell 中不存在这样的事情,所以问题是 - 我应该如何告诉 Haskell 不返回任何内容而继续下一个字符?
最佳答案
你不能只使用 map
,根据定义,它不能改变它所应用的集合的长度。但是,您可以通过切换到 concatMap
来使其工作而无需进行太多更改。 .此函数要求您要映射的函数返回一个列表,然后将所有结果连接在一起。你需要做的就是
dropEvery str n =
concatMap (\(char, indx) -> if indx `mod` n /= 0 then [char] else []) (zip str [1..])
关于Haskell - 有一个函数返回一个空字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36554499/