Il capitolo sulle funzioni parziali dal libro Learn You a Haskell For Great Good contiene il seguente codice:Qual è l'equivalente Python di queste funzioni di ordine superiore Haskell?
multThree :: (Num a) => a -> a -> a -> a
multThree x y z = x * y * z
ghci> let multTwoWithNine = multThree 9
ghci> multTwoWithNine 2 3
54
ghci> let multWithEighteen = multTwoWithNine 2
ghci> multWithEighteen 10
180
Attualmente sto giocando con la libreria functools in Python, e sono riusciti a replicare il comportamento di quelle funzioni che lo utilizzano.
from functools import partial
def multThree(x,y,z):
return x * y * z
>>> multTwoWithNine = partial(multThree,9)
>>> multTwoWithNine(2,3)
>>> multWithEighteen = partial(multTwoWithNine,2)
>>> multWithEighteen(10)
180
Una cosa vorrei ora fare è vedere se riesco a riprodurre alcune delle più interessanti funzioni di ordine superiore dallo stesso capitolo del libro, come ad esempio:
zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith' _ [] _ = []
zipWith' _ _ [] = []
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys
Tuttavia, ho' Non sono sicuro di come fare questo, o se partial()
è addirittura utile qui. funzione built map
Si dovrebbe modificare e correggere le funzioni, assicurandosi che siano tutte sintatticamente corretto. Il tuo primo, ad esempio, manca dei suoi argomenti. –
Tecnicamente dovresti usare 'partial' in qualsiasi conversione, poiché tutte le funzioni di Haskell sono automaticamente curried, e' partial' emula le abilità che le funzioni di curried devono essere parzialmente applicate. Oppure puoi scrivere le versioni python come funzioni al curry, ma poi devi chiamarle come 'foo (a) (b) (c)'. – Wes
Nota secondaria: si desidera "funzioni parzialmente applicate" e non "funzioni parziali". La mappa –