Search code examples
pythonhaskellfunctional-programminglet

Is there a Python equivalent of the Haskell 'let'


Is there a Python equivalent of the Haskell 'let' expression that would allow me to write something like:

list2 = [let (name,size)=lookup(productId) in (barcode(productId),metric(size)) 
            for productId in list]

If not, what would be the most readable alternative?

Added for clarification of the let syntax:

x = let (name,size)=lookup(productId) in (barcode(productId),metric(size))

is equivalent to

(name,size) = lookup(productId)
x = (barcode(productId),metric(size))

The second version doesn't work that well with list comprehensions, though.


Solution

  • You could use a temporary list comprehension

    [(barcode(productId), metric(size)) for name, size in [lookup(productId)]][0]
    

    or, equivalently, a generator expression

    next((barcode(productId), metric(size)) for name, size in [lookup(productId)])
    

    but both of those are pretty horrible.

    Another (horrible) method is via a temporary lambda, which you call immediately

    (lambda (name, size): (barcode(productId), metric(size)))(lookup(productId))
    

    I think the recommended "Pythonic" way would just be to define a function, like

    def barcode_metric(productId):
       name, size = lookup(productId)
       return barcode(productId), metric(size)
    list2 = [barcode_metric(productId) for productId in list]