/ / Comprensione dell'operatore Haskell (<-) - haskell

Comprensione dell'operatore Haskell (<-) - haskell

Stavo studiando il codice al https://rosettacode.org/wiki/Zebra_puzzle#LP-like_version e sono diventato un po 'confuso.

Ecco un esempio minimale di cosa sta succedendo in quel codice.

import Control.Monad
import Data.List

values :: (Bounded a, Enum a) => [[a]]
values = permutations [minBound..maxBound]

data Nation = English | Swede | Dane
deriving (Bounded, Eq, Enum, Show)

data Color = Red | Blue | Green
deriving (Bounded, Eq, Enum, Show)

answers = do

nation <- values
begin nation English

color <- values
end color Red

return $ zip nation color

where
end xs x = guard $ last xs == x
begin xs x = guard $ head xs == x

main :: IO ()
main = do
forM_ answers $ (answer ->  -- for answer in answers:
do
mapM_ print answer
putStrLn "----" )
putStrLn "No more solutions!"

ciò che è misterioso per me è ciò che sta accadendo nel blocco do.

Capisco da varie fonti che il a <- b l'operatore fa un'azione b e lo lega a a. Ma qual è l'azione qui esattamente?

Ho pensato che fosse values ma se commento il begin e end chiamate di funzione e definizioni quindi haskell non sa cosa fare con values più. Immagino che questo sia dovuto al fatto che il test di uguaglianza nelle loro definizioni è ciò che consente a haskell di inferire il tipo (mi sbaglio?).

  1. In tal caso cosa esattamente è il azione Qui?
  2. Anche come fa values sapere quale tipo limitato applicare permutations a? Questa parte sembra abbastanza misteriosa.
  3. Infine, se volessi mantenere lo stesso codice come sopra ma modificarlo elencare tutte le permutazioni (non solo il uno che soddisfa begin e end) come lo farei?

risposte:

0 per risposta № 1

Puoi tradurre do notazione per elencare la notazione di comprensione abbastanza meccanicamente:

answers = [ zip nation color
| nation <- values, head nation == English
, color <- values, last color == Red
]

Non mi piace davvero head e last affari però.