¿Por qué Haskell no puede resolver el tipo de [[]] (Una lista de listas)?
¿Por qué no es simplemente * -> *, ya que puedo darle un tipo como Int, y obtener [[Int]], que es de tipo *.¿Por qué GHCi no puede resolver el tipo de [[]]?
Respuesta
creo que es el mismo que con Maybe Maybe
, aunque en este último caso la razón es quizás más clara: el "exterior" de tipo constructor espera ser aprobado un tipo de clase *
, pero ve un constructor de tipo de tipo * -> *
(la "interno" Maybe
/[]
) y se queja. Si estoy en lo correcto, esto no es realmente un problema con la funcionalidad :kind
de GHCi, sino más bien con la búsqueda de la sintaxis correcta para expresar la composición de constructores de tipo de mayor nivel.
Como solución, algo así como
:kind forall a. [[a]]
:kind forall a. Maybe (Maybe a)
se puede utilizar (con la extensión lenguaje apropiado encendido - ExistentialQuantification
, creo - para permitir la sintaxis forall
).
Este hilo de Haskell Café podría ser relevante: http://www.mail-archive.com/[email protected]/msg08530.html - Composición de Type Constructors. –
No creo que el tipo existencial fuera intencionado (que es '*'). Una manera fácil, pero fuera de GHCi, es 'tipo a = [[a]]' (que es '* -> *'). – sdcvvc
@sdcvvc que es un tipo polimórfico universalmente cuantificado (no es existencial). –
Si desugar [[]]
como [] []
, entonces es obvio que es poco compatible porque [] :: * -> *
.
Si realmente deseaba una "lista de listas", debe componer dos tipos de constructores del tipo * -> *
. No se puede hacer eso sin una pequeña repetición porque Haskell no tiene una lambda de nivel de tipo. Puede hacer esto sin embargo:
newtype Comp f g a = Comp { unComp :: f (g a) }
Ahora se puede escribir:
type ListList = Comp [] []
Y escribir funciones de usarlo:
f :: ListList Int -> ListList Int
f = Comp . map (map (+1)) . unComp
composición Functor como esto tiene aplicaciones en diversas áreas, en particular Swierstra de "Data types a la carte"
- 1. ¿Por qué no puedo definir un nuevo tipo en ghci?
- 2. ¿Qué tipo de problemas puede resolver mapreduce?
- 3. ¿Por qué obtuve el error "no se puede resolver en un tipo"?
- 4. ¿Puede GHCi decirme el tipo de función local de Haskell?
- 5. ¿Por qué Hibernate STRING no se puede resolver?
- 6. ¿Por qué Mathematica no puede resolver esta integral definida?
- 7. ¿Por qué recibo esta advertencia de GHCi?
- 8. "ItemizedOverlay" no se puede resolver con un tipo
- 9. MapActivity no se puede resolver con un tipo
- 10. IntellJ IDEA "no se puede resolver el símbolo" y "no se puede resolver el método"
- 11. Wix no puede resolver el símbolo "Icono"
- 12. ¿Por qué de repente recibí el error "No se puede resolver el objetivo 'android-9'"?
- 13. El valor StaticExtension no se puede resolver
- 14. EditText no se puede resolver con un tipo
- 15. javax.servlet.jsp.PageContext no se puede resolver a un tipo
- 16. System.Web.Extensions El ensamblado no se puede resolver
- 17. vista no se puede resolver con un tipo
- 18. ¿Por qué no se puede serializar todo tipo de objeto?
- 19. DroidGap no se puede resolver en un tipo
- 20. ¿Por qué aparece el error "No se puede resolver el símbolo <symbolname>" en ReSharper?
- 21. Android No se puede resolver el host
- 22. Base64Encoder no se puede resolver
- 23. UnauthorizedAccessException no puede resolver el error Directory.GetFiles
- 24. R.menu no se puede resolver
- 25. ¿Por qué Delphi dice 'no se puede resolver el nombre de la unidad xxx'?
- 26. ¿Por qué Eclipse no puede resolver el esquema de spring-dwr?
- 27. ¿Por qué no puedo declarar el tipo inferido?
- 28. wsimport "No se puede resolver el nombre ..."
- 29. no se puede resolver el símbolo 'servlet'
- 30. No se puede resolver el símbolo: ¿lanzado?
es como preguntar por qué GHC no puede determinar el tipo del valor 'sqr t sqrt' aunque 'sqrt' en sí mismo es' Doble -> Doble' – newacct
: t sqrt sqrt funciona bien en GHCI aunque – Squidly
Es porque 'sqrt' es polimórfico. Una mejor analogía es: t no no. – sdcvvc