purescript - Mapeo de tipos de registros homogéneos

CorePress2024-01-24  7

Supongamos que tenemos un tipo de registro que es homogéneo.

type RecI = { a :: Int, b :: Int, c :: Int, d :: Int, e :: Int }

Queremos obtener de él el tipo con las mismas claves pero diferente tipo de valor:

type RecS = { a :: String, b :: String, c :: String, d :: String, e :: String }

¿Es posible obtener el tipo RecS sin definir explícitamente todas las claves de RecI?

Y la segunda parte de la pregunta, ¿cuál es la mejor manera de implementar la función de mapeo de un tipo a otro?

mapItoS :: (Int -> String) -> RecI -> RecS

?



------------------------------------

Para obtener una conversión gratuita de Int a String a nivel de tipo, simplemente proporcione un parámetro a su registro, luego cree una instancia con Int para obtener RecI y con String para obtener RecS:

type Rec a = { a :: a, b :: a, c :: a, d :: a, e :: a }
type RecI = Rec Int
type RecS = Rec String

Para implementar mapItoS, puede fiPrimero convierta a Foreign.Object usando fromHomogeneous, luego asigne la función sobre él y luego vuelva a convertir al registro.

Desafortunadamente no existe una función toHomogeneous, porque en general no se puede estar seguro de que el Foreign.Object realmente contenga todas las claves necesarias. Pero no importa: en este caso particular puedes estar seguro de que así es, así que puedes salirte con la tuya con unsafeCoerce:

mapItoS :: forall a b. (a -> b) -> Rec a -> Rec b
mapItoS f = fromHomogeneous >>> map f >>> unsafeCoerce

3

Gracias, es sencillo. -)

- COLOR BLANCO

27/03/2021 a las 18:26

@Fyodor Soikin: solo un complemento descarado: github.com/paluh/purescript-homogeneous pero aún no publicado... ;-) WHITECOLOR ¿Debería ponerlo como una respuesta separada?

-paluh

1 de abril de 2021 a las 16:14

@paluh mientras te tengo aquí, ¿serías tan amable de fusionar github.com/paluh/purescript-undefinido-is-not-a-problem/pull/9 y cortar una nueva versión para poder agregarla a ¿El conjunto de paquetes?

- Fiodor Soikin

1 de abril de 2021 a las 17:57



------------------------------------

Un pequeño complemento automático que es estrictamente relevante para la pregunta :-P Acabo de publicar una biblioteca que proporciona muchas instancias que permiten a PureScripter trabajar con registros y variantes homogéneos:

https://pursuit.purescript.org/packages/purescript-homogeneous

Creo que debería tener una inferencia mucho mejor que soluciones como heterogéneas. Échale un vistazo y cuéntame qué te parece.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare