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.