Su solución está bien, pero aquí hay otras tres soluciones que utilizan funciones de la biblioteca base de Haskell.
dr1 m = concatMap (take 1) . iterate (drop m)
De grueso, esto nunca va a terminar (porque nunca se termina iterate
). Así que tal vez una mejor solución sería utilizar unfoldr
:
{-# LANGUAGE TupleSections #-}
import Data.Maybe
dr2 m = unfoldr ((\x-> fmap (,drop m x) (listToMaybe x)))
La función se pasa a un Despliegue puede ser un poco desagradable si no sabe extensiones de GHC y conceptos tales como funtores, aquí es que la solución de nuevo sin el fantasía pies de trabajo (no probado):
dr2 m = unfoldr ((\x -> case listToMaybe x of
Nothing -> Nothing
Just i -> Just (i,drop m x)))
Si no les gusta despliega entonces considerar una cremallera y un filtro:
dr3 m = map snd . filter ((== 1) . fst) . zip (cycle [1..m])
Revisión
Comprender todas estas soluciones es ligeramente diferente. Aprender por qué te hará un mejor programador de Haskell. dr1
utiliza Iterar y por lo tanto nunca se terminan (tal vez esto está bien para listas infinitas, pero probablemente no es una buena solución global):
> dr1 99 [1..400]
[1,100,199,298,397^CInterrupted.
La solución dr2
mostrará todos los valores m
º omitiendo los valores en el Despliegue. El despliegue pasa tanto el valor que se utilizará para el siguiente despliegue como el resultado del desplegado actual en una sola tupla.
> dr2 99 [1..400]
[1,100,199,298,397]
La solución dr3
es un poco más largo, pero probablemente más fácil para un principiante de entender. Primero etiqueta cada elemento en la lista con un ciclo de [1..n, 1..n, 1..n ...]
. En segundo lugar, selecciona solo los números etiquetados con 1
, salteando efectivamente n-1
de los elementos. En tercer lugar, eliminas las etiquetas.
> dr3 99 [1..400]
[1,100,199,298,397]
que se ve bastante idiomática para mí. –
no creo que vayas a obtener este más barato - se ve bien para mí. El único punto es que esto no encaja bien con su descripción ya que 'dr k [1 ..]' no produce la secuencia de preguntas. – Carsten