2012-01-26 5 views
8

A veces, me encuentro con la "característica" que Haskell sólo coincide con cabezas de instancia, a saber,¿Hay alguna extensión de idioma o descendiente de idioma de Haskell que favorezca la expresividad, especialmente en el manejo de instancias?

instance (a ~ NewDataTyp b) => C a 

ahora coincidirá con cualquier tipo que sea, es decir, escribir otra declaración de la instancia de C en su programa se es un error, incluso si no puede posiblemente conflicto debido al contexto a ~ NewDataTyp b. A veces, se necesita un gran esfuerzo para superar; He tenido que reestructurar cientos de líneas de código para evitar esta limitación.

¿Existen extensiones de idioma o idiomas descendientes (Curry? Agda?) Diseñados con una mayor prioridad para la expresividad? Esto podría posiblemente sacrificar (a) la apertura del mundo de clase de clase (b) la comprobación de tipo de tiempo polinomial.

edición - para aquellos interesados ​​en la cuestión, esta página también puede ser de interés: http://www.haskell.org/haskellwiki/Future_of_Haskell

+2

Extracción de la suposición de mundo abierto conduce a [más problemas de lo que cabría esperar] (http://stackoverflow.com/questions/8728596/explicitly-import-instances/8731340#8731340). Hasta donde yo sé, la única forma de recuperarse de ese problema es agregar tipos dependientes completos, e incluir la instancia 'Ord' que se usa en el tipo' Set'. – ehird

+1

La comprobación del tipo de Haskell no es polinómica, ya que la verificación del tipo de HM es (doblemente) exponencial. – augustss

+2

No estoy seguro si Chameleon tuvo tal extensión. Requiere que el solucionador de restricciones realice el rastreo, pero no veo ninguna razón por la que no funcione. – augustss

Respuesta

1

Por lo que vale la pena, Scala acepta la traducción más o menos literal de lo que acaba de escribir. No estoy seguro de lo útil que es.

trait C[T] 
case class NewDataType[T]() 

implicit def letItBeInjectiveWhyNot[K[_],T]: K[T] =:= K[T] 

implicit def cIsh[A,S](implicit ev: A =:= NewDataType[S]): C[A] 
implicit def another: C[Int] 

implicitly[C[NewDataType[String]]] 
implicitly[C[Int]] 
Cuestiones relacionadas