Diciamo che ho il seguente tipo di dati:firma di tipo difficile per le coppie di coppie invertite
data D a b = D (a,b) (b,a)
e voglio definire la seguente funzione su di esso:
apply f (D x y) = D (f x) (f y)
Qual è la firma di tipo di apply
?
Ecco alcuni esempi di f
che sono a posto:
f :: a -> a -- OK
f :: (a, b) -> (b, a) -- OK
f :: (a, b) -> ((a, c), (b, c)) -- OK
In tutti i casi di cui sopra, si finisce con un tipo valido D.
Ma questo non va bene:
f :: (a, b) -> (a, a)
Perché quando inviamo tale funzione tramite apply
finiamo per dover tentare di costruire D (a,a) (b,b)
che non è valido a meno che a = b
.
Non riesco a trovare un tipo di firma per esprimere tutto questo? Inoltre, in generale, c'è un modo per fare in modo che GHC mi dica quali dovrebbero essere queste firme?
Fori tipizzati Edit:
Nel tentativo di trovare il tipo con fori digitati, ho provato la seguente:
x = apply _ (D (1::Int,'a') ('b',2::Int))
e ottenuto:
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
che sembra il fatto che io abbia delle sciocchezze come f :: (Int, Int) -> (b, b)
chiaramente non funzionerà qui.
"c'è un modo per ottenere GHC a dirmi cosa dovrebbero essere queste firme? " - Hai guardato [fori digitati] (https://wiki.haskell.org/GHC/Typed_holes)? – bheklilr
L'ho appena fatto, e ho ottenuto quello che sembra essere un controsenso, come dettagliato nella modifica. – Clinton
Secondo 'ghci',' apply :: ((t, t) -> (b, b)) -> D t t -> D b b'. – Dogbert