Estoy tratando de hacer un simple intérprete de esquema en Haskell. Como parte de esto, ¿estoy implementando algunos operadores primitivos como number ?, string? etc.Haskell función que toma un tipo y un valor y comprueba si el valor tiene ese tipo
tengo código como este:
isNumber :: [LispVal] -> LispVal
isNumber ([Number n]) = Bool True
isNumber _ = Bool False
isString :: [LispVal] -> LispVal
isString ([String n]) = Bool True
isString _ = Bool False
Y lo que me gustaría es algo así como
isType :: ?? -> [LispVal] -> LispVal
isType (typeName [typeName n]) = Bool True
isType _ = Bool False
En otras palabras, me gustaría crear el equivalente de ISNUMBER por diciendo "isType Number". ¿Es esto posible de alguna manera? Estoy luchando por encontrar algo similar en Google, tal vez porque no sé cómo llamar a la situación.
Probablemente debería decir "constructor" en lugar de "tipo" ya que, como está escrito, esta pregunta ni siquiera tiene sentido en el contexto de Haskell. Está representando tipos de Lisp con constructores de Haskell, pero eso no es directamente relevante para la pregunta de Haskell que resulta. – ehird
Data.Typeable puede valer la pena, pero no parece que necesite controles dinámicos aquí. – ExternalReality
Consulte aquí para [una solución de plantilla Haskell] (http://stackoverflow.com/questions/7213974/how-to-examine-a-quoted-data-constructor-name-in-template-haskell/7214422#7214422). Con esto puedes hacer 'isNumber = $ (isA 'Number)' – hammar