yourself type sintaxis learn how functions else define haskell record

haskell - type - ¿Manera abreviada para asignar un solo campo en un registro, mientras se copia el resto de los campos?



type definition haskell (2)

Digamos que tengo el siguiente registro ADT:

data Foo = Bar { a :: Integer, b :: String, c :: String }

Quiero una función que toma un registro y devuelve un registro (del mismo tipo) donde todos menos uno de los campos tienen valores idénticos a los pasados ​​como argumento, así:

walkDuck x = Bar { a = a x, b = b x, c = lemonadeStand (a x) (b x) }

Lo anterior funciona, pero para un registro con más campos (digamos 10 ), crear una función de este tipo implicaría mucha mecanografía que creo que es bastante innecesaria.

¿Hay formas menos tediosas de hacer lo mismo?


Este es un buen trabajo para lenses :

data Foo = Foo { a :: Int, b :: Int , c :: String } test = Foo 1 2 "Hello"

Entonces:

setL c "Goodbye" test

Actualizaría el campo ''c'' de ''prueba'' a su cadena.


Sí, hay una buena manera de actualizar los campos de registro. En GHCi puedes hacer -

> data Foo = Foo { a :: Int, b :: Int, c :: String } -- define a Foo > let foo = Foo { a = 1, b = 2, c = "Hello" } -- create a Foo > let updateFoo x = x { c = "Goodbye" } -- function to update Foos > updateFoo foo -- update the Foo Foo {a = 1, b = 2, c = "Goodbye" }