Pregunta

¿Cuál de los siguientes es más probable que escribir?

r = zip xs $ map sqrt xs

o

r = [(x, sqrt x) | x <- xs]

El código de ejemplo en Internet parece indicar que el primero es más abundante y la manera preferida.

¿Fue útil?

Solución

Me había probabilidades de escritura

map (\x -> (x, sqrt x)) xs

Si prefiere sin punto, el anterior es equivalente a (después de haber importado Control.Monad y Control.Monad.Instances)

map (ap (,) sqrt) xs

Otra alternativa que aún no se ha mencionado es

zipWith (,) xs (map sqrt xs)

Otros consejos

Las personas que pasan demasiado tiempo en #haskell probablemente escribiría que a medida

r = map (id &&& sqrt) xs

(&&&) es un combinador de diversión se define en Control.Arrow. Su tipo de firma real se complica porque se generaliza a todas las instancias de la flecha. Sin embargo, a menudo se utiliza con la instancia (->) de Arrow, lo que da lugar a este tipo de firma:

(&&&) :: (a -> b) -> (a -> c) -> a -> (b, c)

A pesar de que tiendo a no utilizar muy a menudo, en este caso, creo que prefiero la versión lista por comprensión, ya que parece más limpio para mí.

Si usted está en el estilo libre de punto, que le gustaría éste, también:

f = zip `ap` map sqrt

vidas AP en Control.Monad y en este caso, puede ser pensado como el combinador S, que generaliza aplicación en SKI cálculo :

ap f g x == f x (g x)
ap const const == id

Como Conal señala, esto también se puede generalizar a partir Mónada a Aplicativo thusly (Control.Applicative importación):

f = zip <*> map sqrt

Me map probablemente escritura / zip y luego deseo que había escrito la lista por comprensión.

Para ciertos tipos de problemas ( Proyecto Euler en particular), este caso en particular aparece tan a menudo que escribí el siguiendo pequeño ayudante:

with :: (a -> b) -> a -> (a,b)
with f a = (a, f a)

Esto permite que su ejemplo para ser escrito:

r = map (with sqrt) xs

Estoy más de una "vieja escuela" Haskellier, por lo que haría uso de zip `ap` map sqrt y más tarde refactorearlo utilizar el <*> en lugar de ap.

Aplicativo es el nuevo Mónada. (En el sentido de "¿qué Cool Haskell niños usan estos días?")

rara vez usar listas por comprensión, pero ambos son Dandy. Sólo tiene que utilizar la que hace que su código sea más fácil de leer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top