/ / Pochopenie operátora Haskell (<-) - haskell

Pochopenie operátora Haskell (<-) - haskell

Študoval som kód na adrese https://rosettacode.org/wiki/Zebra_puzzle#LP-like_version a trochu zmätené.

Tu je minimálny príklad toho, čo sa deje v tomto kóde.

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

to, čo je pre mňa tajomné, je to, čo sa deje v bloku do.

Rozumiem z rôznych zdrojov, že a <- b operátor vykoná akciu b a viaže to a, Ale aké je to presne akcia?

Predpokladal som, že to bolo values ale ak budem komentovať begin a end funkčné hovory a definície potom haskell nevie, čo s tým robiť values už nie. Myslím, že je to preto, že test rovnosti v ich definíciách je to, čo dovoľuje, aby haskell odvodil typ (mám zle?).

  1. V tom prípade presne je the Akcia tu?
  2. Aj ako sa values vedieť, ktoré ohraničené typ uplatňovať permutations na? Táto časť sa zdá byť docela tajomný.
  3. Nakoniec, ak som chcel zachovať rovnaký kód ako vyššie ale upraviť zoznam von všetky permutácie (nie len ten, ktorý spĺňa begin a end) ako by to?

odpovede:

0 pre odpoveď č. 1

Môžete preložiť do notácia zoznam s porozumením notácie dosť mechanicky:

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

Naozaj don "t takhle head a last podnikania hoci.