2013-08-05 13 views
13

Gdy utworzysz synonim typu z type, ghc/ghci użyje go zamiast oryginalnego typu, gdy zostanie użyty jawnie, ale nigdy nie będzie próbował cofać się od typu wywnioskowanego do zgodnego synonimu. Uzyskanie najbardziej "abstrakcyjnego" synonimu dla danego typu byłoby bardzo przydatne do nauki skomplikowanych aplikacji i bibliotek, które definiują synonimy monadowych stosów i prawdopodobnie synonimów synonimów.Czy istnieje sposób na rozwiązanie synonimów typu w haskell?

Czy ktoś napisał taki fragment kodu? Wyobrażam sobie, że byłoby to wycofanie i wygenerowałoby to również fałszywych kandydatów (np. Jeśli dwa typy są aliasami Stringa, to obie będą kandydatami, gdy tylko String musi zostać rozwiązany), ale może być użyteczne w pewnych sytuacjach.

+0

Bawiłem się z tym samym pomysłem, ponieważ byłoby to bardzo przydatne w przypadku "rur" i "obiektywu". Idealnie byś określił jakąś kompilatorową pragmę, która działa jak reguła, dopasowując wzorzec w wywnioskowanym typie i przepisując go na równoważny synonim typu (z pewnym rodzajem pierwszeństwa, jeśli istnieje wiele dopasowań). –

+1

Przypomina mi się wpis na blogu, który przeczytałem kilka dni temu, który wspomniał o "sygnaturach typu Chthulu": http://joelt.io/entries/yesod-in-production – BruceBerry

+0

brzmi jak coś dobrego dla gsoc lub podobnego – jozefg

Odpowiedz

1

Nie odpowiedź, ale pytanie. Typ synonimy są często używane do estetycznego nazwania typów w "kodzie wysokiego poziomu", ale jak tylko przejdziesz te typy do kodu niższego poziomu/pomocnika (które są zdefiniowane w kategoriach bardziej konkretnych typów), w jaki sposób system powinien śledzić, synonim ma zastosowanie? rozważyć następujące kwestie:

type Title = String 
type Name = String 

capitalise :: String -> String 

my_title = "Mayor" :: Title 

shouted_title = capitalise my_title :: ??? 

jaki sposób typechecker wiedzieć, że String wchodząc funkcji heleper capitalise jest koncepcyjnie tego samego typu jak String wychodzi z capitalise? Czy w sytuacji, gdy istnieje wiele aliasów typów, kontroler powinien wybrać, którego użyć?

0

Kompilator Frege, IDE i REPL starają się to zrobić dla aplikacji typu (z wyjątkiem aplikacji (->)), gdy są poproszone o pokazanie "ładnych" typów i działają w większości przypadków. Oto przykład online session urywek:

frege> type Flubber = (Int, Double) 
frege> x = (42, 3.0) 
frege> :t x  
Flubber 
frege> y = [x,x,x,x] 
frege> :t y 
[Flubber] 

Więc w zasadzie, to powinien również pracować w Haskell (może modulo pewne rozszerzenia w systemie typu w stosunku do Haskell 2010).

Należy jednak pamiętać, że - jak zauważył w swojej odpowiedzi @Thomas - może istnieć wiele sposobów na pozbycie się aliasów typów, a zatem dane wyjściowe mogą wprowadzać w błąd.

Powiązane problemy