2012-01-26 21 views
8

Czasami biegnę do „funkcji”, który Haskell pasuje tylko instancji głowy, mianowicieCzy są jakieś rozszerzenia języka lub potomkowie Haskella, którzy preferują ekspresję, szczególnie w obsłudze instancji?

instance (a ~ NewDataTyp b) => C a 

będzie teraz pasuje do jakiegokolwiek typu, czyli pisząc kolejną deklarację instancji C w programie będzie jest błąd, nawet jeśli to nie może prawdopodobnie być konfliktem z powodu kontekstu a ~ NewDataTyp b. Czasami pokonanie wymaga wiele wysiłku; Musiałem zrestrukturyzować setki linii kodu, aby uniknąć tego ograniczenia.

Czy są jakieś rozszerzenia językowe lub języki potomne (Curry? Agda?), Które zostały zaprojektowane z wyższym priorytetem dla ekspresji? To może potencjalnie poświęcić (a) otwartość świata typeclass (b) typowania wielomianowego czasu.

edit - dla zainteresowanych w pytaniu, strona ta może być także interesujące: http://www.haskell.org/haskellwiki/Future_of_Haskell

+2

Zdejmowanie otwartym światem założenie prowadzi do [więcej problemów niż można się było spodziewać] (http://stackoverflow.com/questions/8728596/explicitly-import-instances/8731340#8731340). O ile mi wiadomo, jedynym sposobem na odzyskanie tego problemu jest dodanie pełnych typów zależnych i włączenie instancji 'Ord' używanej w typie' Set'. – ehird

+1

Sprawdzanie typu Haskella nie jest wielomianem, ponieważ sprawdzanie typu HM jest (podwójnie) wykładnicze. – augustss

+2

Nie jestem pewien, czy Chameleon miał takie przedłużenie. Wymaga on rozwiązania do rozwiązywania ograniczeń, ale nie widzę powodu, dla którego nie powinien on działać. – augustss

Odpowiedz

1

Na co warto, Scala akceptuje tłumaczenie bardziej lub mniej dosłowne, co właśnie napisałem. Nie jestem pewien, jakie to przydatne.

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]]