Supponiamo che io ho una funzione con la seguente firma tipo:Uso delle voci in una lista come argomenti
g :: a -> a -> a -> b
Ho anche una lista di a
s-chiamiamolo xs
-che so che conterrà almeno tre elementi. Vorrei applicare g
ai primi tre articoli di xs
. So che potrei definire un combinatore come la seguente:
($$$) :: (a -> a -> a -> b) -> [a] -> b
f $$$ (x:y:z:_) = f x y z
Poi ho potuto solo usare g $$$ xs
. Questo rende $$$
un po 'come uncurry
, ma per una funzione con tre argomenti dello stesso tipo e una lista invece di una tupla.
C'è un modo per farlo in modo idiomatico utilizzando i combinatori standard? O meglio, qual è il modo più idiomatico per farlo in Haskell? Ho pensato di provare pointfree
su una versione non infissa di $$$
potrebbe darmi un'idea di dove iniziare, ma l'output era un abominio con 10 flip
s, una manciata di head
se tail
se ap
s e 28 parentesi.
(NB: So che questa non è una cosa terribilmente Haskelly da fare in primo luogo, ma mi sono imbattuto in un paio di situazioni in cui sembra una soluzione ragionevole, specialmente quando si usa Parsec. certamente accettare "non mai fare questo nel codice vero e proprio" se questa è la risposta migliore, ma preferirei vedere qualche trucco intelligente che coinvolge la monade ((->) r)
o qualsiasi altra cosa.)
Non vedo cosa c'è di sbagliato nel codice che hai. È breve e al punto. Non tutto deve essere (o dovrebbe essere) senza punti. – sepp2k
Non penso necessariamente che ci sia qualcosa di sbagliato in questo: sono solo curioso di sapere se c'è un modo conciso per farlo senza definire un nuovo combinatore come "$$$". –
Nota che questa è una funzione parziale, quindi ... probabilmente una cattiva idea in generale :) Potresti star meglio con un '($$$) :: (a -> a -> a -> b) -> [a] -> Forse b' –