Mapa de actualización en Haskell -- haskell camp codereview Relacionados El problema

Update Map in Haskell


8
vote

problema

Español

Escribí una función que inserta o actualiza un 9988776655544338 Dependiendo de si el 9988776665544339 ya está en el io_context0 . Si es así, entonces el io_context1 se agrega al valor ya existente 99887766555443312 .

  io_context3  

Pruebas

  io_context4  

por favor crítica.

Original en ingles

I wrote a function that inserts or updates a Map key value depending on whether the key is already in the map. If it is, then the value gets added to the already existing map's value.

import Data.Map as Map  updateMap :: (Ord k, Num v) => k -> v -> Map k v -> Map k v updateMap k v map = if member k map then Map.adjust (+ v) k map                     else Map.insert k v map  

Tests

*Main> updateMap 1 1 $ Map.singleton 1 100 fromList [(1,101)] *Main> updateMap 2 1 $ Map.singleton 1 100 fromList [(1,100),(2,1)] *Main> updateMap 1 33 $ Map.singleton 1 100 fromList [(1,133)] 

Please critique.

  

Lista de respuestas

13
 
vote
vote
La mejor respuesta
 
  q5  

Proceso:

Observe el uso de map.insert

Observe que está asignando (+) sobre la posibilidad de tener o no tener un valor

Observe que Data.Map tiene una función para aplicar funciones a valores, llamado Data.Map.Insertwith. Es extremadamente común que las colecciones tengan una función de ayuda para "insertar datos con una función de ayuda / valor predeterminado"

Observe la estructura compartida de los tipos de su función e inserción con

  q6  

Date cuenta de que la aplicación (+) para insertar con los tipos hará que los tipos idénticos

  q7  

Valide los supuestos con ejemplos específicos, más rigor está disponible con el uso de QuickCheck.

  q8  

Esta es una oportunidad prácticamente de oro para demostrar cómo la reducción de ETA puede simplificar el código y matar la lógica redundante.

 
updateMapPF :: (Ord k, Num a) => k -> a -> Map k a -> Map k a updateMapPF = Map.insertWith (+)  xcexbb> updateMapPF 1 1 $ Map.singleton 1 100 fromList [(1,101)] xcexbb> updateMapPF 2 1 $ Map.singleton 1 100 fromList [(1,100),(2,1)] xcexbb> updateMapPF 1 33 $ Map.singleton 1 100 fromList [(1,133)] 

Process:

Notice the use of Map.insert

Notice that you are mapping (+) over the possibility of having or not having a value

Notice that Data.Map has a function for applying functions to values, called Data.Map.insertWith. It's extremely common for collections to have a helper function for "insert data with a helper function / default value"

Notice the shared structure of the types of your function and insertWith

insertWith :: Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a  updateMap  :: (Ord k, Num v) =>         k -> v -> Map k v -> Map k v 

Realize that applying (+) to insertWith will make the types identical

xcexbb> :t insertWith  insertWith   :: Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a  xcexbb> :t insertWith (+)  insertWith (+) :: (Ord k, Num a) => k -> a -> Map k a -> Map k a 

Validate assumptions with specific examples, more rigor is available with the use of QuickCheck.

xcexbb> updateMapPF 1 1 $ Map.singleton 1 100 fromList [(1,101)]  xcexbb> updateMapPF 2 1 $ Map.singleton 1 100 fromList [(1,100),(2,1)]  xcexbb> updateMapPF 1 33 $ Map.singleton 1 100 fromList [(1,133)] 

This is a practically golden opportunity to demonstrate how eta reduction can simplify code and kill off redundant logic.

 
 

Relacionados problema

3  BEFUNMENT-93 intérprete en Haskell  ( Befunge 93 interpreter in haskell ) 
Este es un intérprete que toma en un bEFUNCH-93 más alterado (sin entrada del usuario, sin límites en el tamaño y la división por los valores predeterminados ...

4  Agregar una entrada duplicada al azar a una lista en Haskell usando Mónad aleatorio  ( Adding a duplicate entry randomly into a list in haskell using random monad ) 
Hay una nueva versión de esto como V2 - Agregar una entrada duplicada al azar a una lista en Haskell usando Monad Random Escribí esto tratando de configur...

3  Implementación de la división de flujos (donde es una corriente de coeficientes polinomiales)  ( Implementing division of streams where its a stream of polynomial coefficients ) 
por esta tarea , yo ' m Tratando de implementar un Fractional (Stream Integer) donde la corriente representa los coeficientes de polinomios: donde q se ...

6  Nuevo paquete Haskell: OpenCl  ( New haskell package opencl ) 
Estoy desarrollando una encuadernación de OpenCl de alto nivel en Haskell, y necesito revisión de pares y pruebas. Actualmente solo recibe la plataforma y la ...

6  Programa Haskell para cambiar el nombre de las imágenes basadas en datos exif  ( Haskell program to rename images based on exif data ) 
movido originalmente de StackOverFlow , sin saber la existencia de este sitio hermano ... Debe decir que encuentro la programación en Haskell para requer...

4  Simple Haskell Key Value File Store  ( Simple haskell key value file store ) 
Como ejercicio en el aprendizaje de Haskell, implementé una tienda de valores clave simple, donde puede poner y obtener valores (como ByteString s). (Para r...

2  Palidrome Checker en Haskell  ( Palidrome checker in haskell ) 
Decidí evitar el 9988776655544339 intentado escribir un método con la coincidencia de patrones y la recursión. #include <stdio.h> #include <fcntl.h> #inc...

3  Generador de horario aleatorio  ( Random schedule generator ) 
En un intento de probar algo nuevo, y posiblemente ayudar en el trabajo, intenté crear un generador de programación aleatorio que genera horarios basados ​​en...

4  Decidir si una lista de tipos de sumas es homogénea  ( Deciding whether a list of sum types is homogeneous ) 
Me encontré con un problema recientemente, donde tuve que decidir si un conjunto de tipos de sumas fue homogéneo (todo lo mismo). En sí mismo, este es un prob...

5  Seguridad, Compartir y Laziness  ( Safety sharing and laziness ) 
¿Hay una manera más sucinta de escribir un código como este que tenga mucho compartir entre las sucursales de la declaración de la caja? (Esta es la parte p...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos