Powiedzmy mam następujący typ danych:Tricky typ podpis dla par pary odwrócone
data D a b = D (a,b) (b,a)
I chcę, aby zdefiniować następującą funkcję od niego:
apply f (D x y) = D (f x) (f y)
Co to jest podpis typu z apply
?
Oto kilka przykładów f
które są w porządku:
f :: a -> a -- OK
f :: (a, b) -> (b, a) -- OK
f :: (a, b) -> ((a, c), (b, c)) -- OK
We wszystkich powyższych przypadkach, możemy skończyć z ważnego typu D.
Ale to nie jest w porządku:
f :: (a, b) -> (a, a)
Ponieważ po wysłaniu takiej funkcji przez apply
, musimy spróbować zbudować D (a,a) (b,b)
, która jest nieważna, chyba że a = b
.
Nie mogę wydawać się podpis typu, aby wyrazić to wszystko? Ponadto, czy istnieje sposób, aby GHC powiedział mi, jakie powinny być te podpisy?
Wpisywane Holes Edycja:
Próbując odnaleźć typ za pomocą wpisywanych otwory, próbowałem następujące:
x = apply _ (D (1::Int,'a') ('b',2::Int))
I got:
Found hole ‘_’ with type: (Int, Int) -> (b, b)
Where: ‘b’ is a rigid type variable bound by
the inferred type of x :: D b b
co wydaje się mnie bycie nonsensem jako f :: (Int, Int) -> (b, b)
najwyraźniej nie będzie tu działać.
„czy istnieje sposób, aby uzyskać GHC mi powiedzieć jakie powinny być te podpisy? " - Czy patrzyłeś na [typowane dziury] (https://wiki.haskell.org/GHC/Typed_holes)? – bheklilr
Po prostu to zrobiłem i otrzymałem z powrotem to, co wydaje się nonsensem, jak to opisano w edycji. – Clinton
Zgodnie z 'ghci',' apply :: ((t, t) -> (b, b)) -> D t t -> D b b'. – Dogbert