sto cercando di esprimere la seguente mappa come una funzione Haskell:Haskell: a -> a -> ... -> b per [a] -> b
Dati due tipi a, b
considerano la famiglia di funzioni F(a, b)
costituiti funzioni del tipo
f :: a -> a -> ... -> a -> b
con n
ripetizioni di a
, dove n
è un numero intero maggiore di zero. Quello che voglio è quello di mappare ogni funzione f
in F(a, b)
a una funzione f' :: [a] -> b
, in modo tale che f x1 x2 ... xr = f' [x1, ..., xr]
, dove r
è inferiore al numero di argomenti f
richiederà (vale a dire che sto cercando la funzione listify :: F(a, b) -> ([a] -> b)
). Se ci sono più elementi di f
accetta argomenti, gli elementi aggiuntivi devono essere eliminate:
f :: a -> a -> b
(listify f xs) == (listify f $ take 2 xs)
Inoltre, se l'quotata vuoto viene passato, qualsiasi valore è accettabile.
Sono ovviamente in grado di implementare questa mappa per funzioni con un numero fisso di argomenti (ad esempio: listify :: (a -> a -> b) -> ([a] -> b)
, ecc.), Ma non sono riuscito a trovare un modo per scrivere una funzione che lo faccia per tutti f
in F(a, b)
contemporaneamente. Anche se Template Haskell è probabilmente in grado di fornirmi gli strumenti giusti, non mi interessa una soluzione del genere. Voglio trovare un modo puro "tipo magico" per farlo.
Qualcuno sa se è possibile? Qualcuno può forse indicarmi la giusta direzione? O si tratta di un "problema" noto che è stato risolto miliardi di volte e non riesco a trovare una soluzione?
È possibile eseguire questa operazione con alcuni trucchi 'OverlappingInstances' (forse anche con estensioni meno controverse), ma dubito che sia una buona idea. Perché non usi semplicemente la funzione di accettazione della lista così com'è? – leftaroundabout
Per quanto riguarda "Perché?": La domanda se questo sia possibile o non appena mi è venuto in mente -> Sto chiedendo ragioni educative (forse anche imparare qualche nuova magia di Haskell, mentre cerco di trovare una soluzione). Sono un po 'confuso su quale "lista che accetta la funzione" a cui ti stai riferendo. Ho una funzione f :: a -> a -> ... a -> b (con un numero sconosciuto di 'a's) e voglio una funzione f' :: [a] -> b, tale che f x1 .. . xr = f '[x1, ...., xr]. Quindi, non ho una lista che accetta la funzione, ne voglio una! Ma probabilmente non ho capito cosa volevi dire. – morris
Cosa faresti esattamente con 'OverlappingInstances' per farlo funzionare? Non vedo alcun modo per farlo. – morris