multiplicar - Haskell mapa/zip vs. lista de comprensión
multiplicar haskell (7)
Aunque tiendo a no usarlos muy a menudo, en este caso, creo que preferiría la versión de la lista de comprensión, ya que me parece más limpia.
Si te gusta el estilo sin puntos, este también te puede gustar:
f = zip `ap` map sqrt
Ap vive en Control.Monad y, en este caso, puede considerarse como el combinador S, que generaliza la aplicación en el cálculo de SKI :
ap f g x == f x (g x)
ap const const == id
Como señala Conal, esto también puede generalizarse de la Mónada al Aplicativo (control de importación.Aplicativo):
f = zip <*> map sqrt
¿Cuál de los siguientes es más probable que escribas?
r = zip xs $ map sqrt xs
o
r = [(x, sqrt x) | x <- xs]
El código de muestra en Internet parece indicar que el primero es más abundante y la forma preferida.
Las personas que pasan demasiado tiempo en #haskell probablemente escribirían eso como
r = map (id &&& sqrt) xs
(&&&)
es un divertido combinador definido en Control.Arrow
. Su firma de tipo real es complicada porque se generaliza a todas las instancias de Arrow. Pero a menudo se usa con la instancia (->)
de Arrow
, que da como resultado esta firma de tipo:
(&&&) :: (a -> b) -> (a -> c) -> a -> (b, c)
Para ciertos tipos de problemas (en particular el Proyecto Euler ), este caso en particular aparece tan a menudo que escribí el siguiente ayudante:
with :: (a -> b) -> a -> (a,b)
with f a = (a, f a)
Esto permite escribir su ejemplo:
r = map (with sqrt) xs
Probablemente escribiría
map (/x -> (x, sqrt x)) xs
Si prefiere sin puntos, lo 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)
Probablemente escribiría map
/ zip
y luego me gustaría haber escrito la lista de comprensión.
Raramente uso listas de comprensión, pero ambas son excelentes. Solo usa el que hace que tu código sea más fácil de leer.
Soy más un "Old School" Haskellier, así que usaría zip `ap` map sqrt
y luego lo refactorizaré para usar <*>
lugar de ap
.
Aplicativo es la nueva mónada. (En el sentido de "¿qué usan los Cool Haskell Kids en estos días?")