/ / Zrozumienie operatora Haskella (<-) - haskell

Zrozumienie operatora Haskella (<-) - haskell

Studiowałem kod nad https://rosettacode.org/wiki/Zebra_puzzle#LP-like_version i trochę się pogubili.

Oto minimalny przykład tego, co dzieje się w tym kodzie.

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

dla mnie tajemnicze jest to, co dzieje się w bloku do.

Rozumiem z różnych źródeł, że a <- b operator wykonuje działanie b i wiąże go a. Ale czym dokładnie jest ta akcja?

Zakładałem, że to było values ale jeśli skomentuję begin i end wywołania funkcji i definicje, a następnie haskell nie wie, co zrobić z values już. Sądzę, że dzieje się tak dlatego, że test równości w ich definicjach pozwala wnioskować o tym rodzaju (czy jestem zły?).

  1. W takim razie co dokładnie jest the działania tutaj?
  2. Również jak ma values wiedzieć, który ograniczonego typu do zastosowania permutations do? Ta część wydaje się dość tajemniczy.
  3. Wreszcie jeśli chciałem zachować taki sam kod jak wyżej ale do modyfikacji listy z wszystkich permutacji (nie tylko ten, który spełnia begin i end) jak to zrobi?

Odpowiedzi:

0 dla odpowiedzi № 1

Można tłumaczyć do Zapis listy ze zrozumieniem notacji dość mechanicznie:

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

Naprawdę don "t, jak to head i last biznesowe choć.