2015-02-19 14 views
8

Uwzględniając dwie funkcje:Generic zalegających w Haskell

f :: (A a, B b) => a -> b 
g :: (B b, C c) => b -> c 

Czy istnieje jakikolwiek sposób (w GHC) Mogę zrobić to można napisać:

h x = g (f x) 

bez konieczności dodać podpis typu dla f x np

h x = g ((f x) :: T) 

Poprzez pewne „domyślny typ”, który f x potrzebny, jeśli żadna określona?

Podejrzewam, że potrzebuję czegoś takiego jak Defaulting in Haskell Prime, ale czy zostało to zaimplementowane w GHC (lub w GHC)?

+2

Z tego, co wiem, powiązana propozycja nie jest ani wdrażana, ani planowana dla GHC; i nie mogę wymyślić żadnych innych sztuczek, które pozwoliłyby ci całkowicie uniknąć dodawania adnotacji typu. Aplikacja [Explicit type application] (https://ghc.haskell.org/trac/ghc/wiki/ExplicitTypeApplication), którą rozumiem, jest planowana (ale niezaawansowana) może dostarczyć ci nieco lżejszej składni. Ale nie jestem pewien "Nie mogłem nic wymyślić" naprawdę kwalifikuje się jako odpowiedź ... –

Odpowiedz

1

Głupi non-odpowiedź:

asT :: T -> T 
asT = id 

h = g . asT . f 

Brak "zalegających" jest jednym z bólami smaku Haskell za generyków. Rzeczy stają się zbyt ogólne i Haskell nie wie, którą instancję wybrać. Status quo jest taki, że "programista musi jawnie rozwiązać niejednoznaczność." Zamiast określać reguły najwyższego poziomu za niewykonanie, wystarczy wybrać odpowiednią instancję na podstawie poszczególnych przypadków. Num defaulting jest odstraszającym wyjątkiem od tej reguły.

Propozycja, którą połączyłeś, jest dobrym przykładem tego, dlaczego wybór wartości domyślnych nie jest trywialny, gdy zaangażowanych jest wiele klas.

default A (Int, String,()) 
default B (String, Int,()) 
(A t, B t) => t -- defaults to what?