/ / Comprendre l'opérateur Haskell (<-) - haskell

Comprendre l'opérateur Haskell (<-) - haskell

J'étudiais le code à https://rosettacode.org/wiki/Zebra_puzzle#LP-like_version et est devenu un peu confus.

Voici un exemple minimal de ce qui se passe dans ce code.

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!"

ce qui est mystérieux pour moi, c'est ce qui se passe dans le bloc do.

Je comprends de diverses sources que le a <- b l'opérateur fait une action b et le lie à a. Mais quelle est l'action ici exactement?

J'ai supposé que c'était values mais si je commente la begin et end appels de fonction et définitions alors haskell ne sait pas quoi faire avec values plus Je suppose que c'est parce que le test d'égalité dans leurs définitions est ce qui permet à haskell d'inférer le type (je me trompe?).

  1. Dans ce cas quoi exactement est la action ici?
  2. Aussi comment values savoir quel type borné appliquer permutations à? Cette partie semble assez mystérieuse.
  3. Enfin, si je voulais garder le même code comme ci-dessus, mais modifiez-le liste toutes les permutations (pas seulement le un qui satisfait begin et end) comment pourrais-je le faire?

Réponses:

0 pour la réponse № 1

Tu peux traduire do notation à la liste notation de compréhension assez mécaniquement:

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

Je n'aime vraiment pas ça head et last affaires cependant.