the_tags tag name get_the_tags get_the_tag_list first codex all function haskell functional-programming

function - name - the_tags wordpress



Usos para la función de identificación Haskell (9)

Dado que estamos encontrando buenas aplicaciones de id . Aquí, tienes un palíndromo :)

import Control.Applicative pal :: [a] -> [a] pal = (++) <$> id <*> reverse

¿Cuáles son los usos para la función de identificación en Haskell?


En los lenguajes funcionales, las funciones son valores de primera clase que puede pasar como un parámetro. De modo que uno de los usos más comunes de la id aparece cuando pasa una función como parámetro a otra función para decirle qué hacer. Es probable que una de las opciones de qué hacer sea "simplemente déjelo en blanco": en ese caso, pasa el id como parámetro.


Es útil como argumento para funciones de orden superior (funciones que toman funciones como argumentos), donde desea que se deje sin cambios algún valor particular.

Ejemplo 1 : deje un valor solo si está en Just, de lo contrario, devuelva un valor predeterminado de 7.

Prelude Data.Maybe> :t maybe maybe :: b -> (a -> b) -> Maybe a -> b Prelude Data.Maybe> maybe 7 id (Just 2) 2

Ejemplo 2 : crear una función mediante un doblez:

Prelude Data.Maybe> :t foldr (.) id [(+2), (*7)] :: (Num a) => a -> a Prelude Data.Maybe> let f = foldr (.) id [(+2), (*7)] Prelude Data.Maybe> f 7 51

Creamos una nueva función f al plegar una lista de funciones junto con (.) , Usando id como caso base.

Ejemplo 3 : el caso base para funciones como monoides (simplificado).

instance Monoid (a -> a) where mempty = id f `mappend` g = (f . g)

De forma similar a nuestro ejemplo con fold, las funciones se pueden tratar como valores concatenables, con id sirviendo para el caso vacío y (.) Como append.

Ejemplo 4 : una función hash trivial.

Data.HashTable> h <- new (==) id :: IO (HashTable Data.Int.Int32 Int) Data.HashTable> insert h 7 2 Data.HashTable> Data.HashTable.lookup h 7 Just 2

Las tablas hash requieren una función de hash. Pero, ¿y si tu clave ya tiene hash? A continuación, pase la función de id., Para completar como método de hashing, con cero gastos generales.


Imagina que eres una computadora, es decir, puedes ejecutar una secuencia de pasos. Entonces, si quiero que permanezcas en tu estado actual, pero siempre tengo que darte una instrucción (no puedo simplemente silenciar y dejar pasar el tiempo), ¿qué instrucción te doy? Id es la función creada para eso, para devolver el argumento sin cambios (en el caso de la computadora anterior, el argumento sería su estado) y para tener un nombre para él. Esa necesidad aparece solo cuando tienes funciones de orden alto, cuando operas con funciones sin considerar lo que hay dentro de ellas, eso te obliga a representar simbólicamente incluso la implementación de "no hacer nada". Análogamente 0 visto como una cantidad de algo, es un símbolo de la ausencia de cantidad. En realidad, en Algebra, tanto 0 como id se consideran los elementos neutros de las operaciones + y ∘ (composición de la función), respectivamente, o más formalmente:

para todos los x de tipo número:

  • 0 + x = x
  • x + 0 = x

para todo tipo de función de tipo:

  • id ∘ f = f
  • f ∘ id = f

Para un tipo diferente de respuesta:

A menudo haré esto cuando encadenar múltiples funciones a través de la composición:

foo = id . bar . baz . etc

encima

foo = bar . baz . etc

Mantiene las cosas más fáciles de editar. Uno puede hacer cosas similares con otros elementos ''cero'', como

foo = return >>= bar >>= baz foos = [] ++ bars ++ bazs


Si manipulas números, particularmente con suma y multiplicación, habrás notado la utilidad de 0 y 1. Del mismo modo, si manipulas listas, la lista vacía resulta bastante útil. Del mismo modo, si manipulas funciones (muy comunes en la programación funcional), notarás el mismo tipo de utilidad de id .


Siempre que necesite tener una función en alguna parte, pero quiera hacer algo más que simplemente mantener su lugar (con ''indefinido'' como ejemplo).

También es útil, como (próximamente) el Dr. Stewart mencionado anteriormente, para cuando necesitas pasar una función como argumento a otra función:

join = (>>= id)

o como resultado de una función:

let f = id in f 10

(presumiblemente, editarás la función anterior más adelante para hacer algo más "interesante" ...;)

Como otros han mencionado, id es un maravilloso lugar para cuando necesites una función en alguna parte.


Supongamos que estás buscando algún tipo de solución para un rompecabezas donde haces un movimiento en cada turno. Empiezas con una posición de candidato pos . En cada etapa hay una lista de posibles transformaciones que podrías hacer a pos (por ejemplo, deslizar una pieza en el rompecabezas). En un lenguaje funcional, es natural representar las transformaciones como funciones, de modo que ahora puede hacer una lista de movimientos usando una lista de funciones. Si "no hacer nada" es un movimiento legal en este rompecabezas, entonces lo representarías con id . Si no hiciste eso, entonces necesitarías manejar "no hacer nada" como un caso especial que funciona de manera diferente a "hacer algo". Al usar id , puede manejar todos los casos de manera uniforme en una sola lista.

Esta es probablemente la razón por la que existen casi todos los usos de id . Manejar "no hacer nada" uniformemente con "hacer algo".


También puedo ayudar a mejorar tu puntaje de golf. En lugar de usar

($)

puedes guardar un solo personaje usando id.

p.ej

zipWith id [(+1), succ] [2,3,4]

Un resultado interesante, más que útil.