Haskell - 有一个函数返回一个空字符

Rau*_*lev 6 haskell functional-programming

我正在尝试创建一个函数,从字符串中删除每个第n个元素.

dropEvery :: String -> Int -> String
dropEvery str n = map (\(char, indx) -> if indx `mod` n /= 0 then char else ' ') (zip str [1..])
Run Code Online (Sandbox Code Playgroud)

现在它只是用空格替换每个第n个元素,但如果我希望它返回"空字符",我应该在"else"之后放置什么.我知道Haskell中不存在这样的事情所以问题是 - 我怎么能告诉Haskell不返回任何东西而只是转移到下一个字符?

bhe*_*ilr 7

map根据定义,你无法做到这一点,它不能改变它所应用的集合的长度.但是,您可以通过切换到无需太多更改即可使用此功能concatMap.此函数需要您正在映射的函数返回一个列表,然后将所有结果连接在一起.你需要做的就是

dropEvery str n =
    concatMap (\(char, indx) -> if indx `mod` n /= 0 then [char] else []) (zip str [1..])
Run Code Online (Sandbox Code Playgroud)


Lee*_*Lee 5

map保留列表的结构,而您的操作通过删除元素来修改它.这意味着你不能使用map,但你可以使用mapMaybe它,它允许你提供一个函数,它返回Nothing你想要从输出中删除的元素:

import Data.Maybe (mapMaybe)
dropEvery str n = mapMaybe (\(char, indx) -> if indx `mod` n /= 0 then Just(char) else Nothing) (zip str [1..])
Run Code Online (Sandbox Code Playgroud)