Próbuję utworzyć funkcję, która spada co n-ty element z ciągu znaków.Haskell - funkcja zwraca pusty znak
dropEvery :: String -> Int -> String
dropEvery str n = map (\(char, indx) -> if indx `mod` n /= 0 then char else ' ') (zip str [1..])
Teraz to po prostu zamienia każdy element n'th z miejsca, ale co mam umieścić po „inny”, jeśli chcę wrócić „pustym char”. Rozumiem, że coś takiego nie istnieje w Haskell, więc pytanie brzmi: jak mam powiedzieć Haskellowi, aby niczego nie zwracał i po prostu przejdzie do następnego znaku?
Próbowałem wstawić "[]" po "innym", ale oczywiście skończyło się otrzymaniem błędów typu. concatMap to dobry pomysł. –
@ RaulŠpilev Problem wynika z założenia, że istnieje coś, co nazywa się "pustą Charą". To byłoby jak "puste' Int' "lub" puste 'Bool'", możesz mieć 'Int', który wynosi 0, ale nie taki, który nie ma żadnej wartości (nie licząc' niezdefiniowanych') . Aby mieć pustkę, potrzebujesz pojemnika. Ciągi są kontenerami, ponieważ są po prostu listą 'Char's, więc mając funkcję' (Char, Int) -> [Char] ', możesz użyć' concatMap' zamiast '[(Char, Int) ], aby wydostać '[Char]'. – bheklilr