2015-05-16 12 views
9

Jak wiem, -> ma rodzaj *->*->*, a ((->) r) ma rodzaj *->*.Dosłowne literał w Haskell

Zakładając, że istnieje typ (a->b->c), czy istnieje sposób na przedstawienie (a->b->)?

Próbowałem ((->) a ((->) b)), ale to błąd.

Próbowałem:

type Kab a b c = (a -> b -> c) -- it is ok 

Ale to jest nie używać Kab w deklaracji instancji:

instance KClass (Kab a b) where -- error 

Jedynym sposobem, znalazłem, że działa to zadeklarować data:

data Kab a b c = Kab (a -> b -> c) 
instance KClass (Kab a b) where .. 

Ale jeśli używam danych, muszę odwijać Kab, natomiast moim pomysłem jest wdrożenie KClass na natywnym typie funkcji.

Jak to zrobić?

Odpowiedz

10

Niestety nie można tego zrobić.

Można życzyć sobie "lambd typu type" (napiszmy je: /\); wtedy można by napisać forall a b. /\c. a -> b -> c, aby to zaznaczyć. Byłaby to bardzo przydatna funkcja i wiele badań dotyczyło systemów typów, które pozwalają na to, ale cena, którą płacisz, jest taka, że ​​wnioskowanie typu staje się nierozstrzygalne. Tak więc komitet Haskell postanowił go pominąć.

+1

* Tak więc komitet Haskell zdecydował się go pominąć. * Czy możesz dodać jakieś odniesienie? – Jubobs

+1

@Jubobs Nie jestem pewien, co dokładnie chcesz zobaczyć tutaj. W raporcie nie ma lambdas na poziomie typu; ale to nie jest jakaś sekcja, w której się nie ma lub coś takiego. –

+2

Typ wnioskowania z typem lambdas jest rozstrzygalny dla fragmentu wzoru Millera, który zawiera wszystkie rzeczy, które mamy z aktualnymi konstruktorami typu Haskella. Myślę, że lepiej jest powiedzieć, że nie mamy typu lambdas w Haskell, ponieważ nie było na to zbyt dużej potrzeby, a pisanie zależne było eksperymentalną przestrzenią projektową do niedawna. –

Powiązane problemy