14

Posso unsugar di lista in questa espressione:Rimozione zucchero sintattico: Lista di comprensione in Haskell

[(i,j) | i <- [1..4], j <- [i+1..4]] 

Questa è l'uscita:

[(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)] 

Come posso io, con la mappa, filtro e così via , scrivi quel pezzo di codice?

modificare

Ecco un altro:

[(i,j,k) | i <- [1..6], j <- [i+1..6],k <- [j+1..6]] 

Questa è l'uscita:

[(1,2,3),(1,2,4),(1,2,5),(1,2,6),(1,3,4),(1,3,5),(1,3,6),(1,4,5),(1,4,6),(1,5,6),(2,3,4),(2,3,5),(2,3,6),(2,4,5),(2,4,6),(2,5,6),(3,4,5),(3,4,6),(3,5,6),(4,5,6)] 

risposta

23

Le comprensibilità delle liste (in pratica, la comprensione di Monade) può essere desugared nella notazione do.

do i <- [1..4] 
    j <- [i+1..4] 
    return (i,j) 

Che può essere private degli zuccheri come al solito:

[1..4] >>= \i -> 
[i+1..4] >>= \j -> 
return (i,j) 

E 'ben noto che a >>= \x -> return b è lo stesso di fmap (\x -> b) a. Quindi, un passo intermedio Dezuccheraggio:

[1..4] >>= \i -> 
fmap (\j -> (i,j)) [i+1..4] 

Per gli elenchi, (>>=) = flip concatMap e fmap = map

(flip concatMap) [1..4] (\i -> map (\j -> (i,j) [i+1..4]) 

flip passa semplicemente l'ordine degli ingressi.

concatMap (\i -> map (\j -> (i,j)) [i+1..4]) [1..4] 

Ed è così che si finisce con la risposta di Tsuyoshi.


Il secondo può rivelarsi private degli zuccheri in:

concatMap (\i -> 
    concatMap (\j -> 
    map  (\k -> 
     (i,j,k)) 
    [j+1..6]) 
    [i+1..6]) 
[1..6] 
1
concatMap (\i -> map (\j -> (i, j)) [i+1 .. 4]) [1 .. 4] 
+0

Grazie per la risposta :) – Carlochess

2

Il codice Dezuccherato è:

concatMap (\i -> concatMap (\j -> (i, j) : []) [i+1..4]) [1..4] 

Quale può essere refactored alla risposta di Tsuyoshi Ito.

2

C'è ancora un altro schema di traduzione, è a causa di Wadler, per quanto ne so.

Questo darebbe:

let 
    lc_outer (x:xs) = let lc_inner (y:ys) = (x,y) : lc_inner ys 
          lc_inner []  = lc_outer xs 
         in lc_inner [x+1.. 4] 
    lc_outer [] = [] 
in lc_outer [1..4] 

Questa traduzione evita la costruzione di liste inutile Singleton nel livello più interno che avrebbe bisogno di ottenere appiattito con concatMap tardi.

Problemi correlati