/ / Розуміння Haskell (<-) оператор - haskell

Розуміння Haskell (<-) оператора - haskell

Я вивчав кодекс у https://rosettacode.org/wiki/Zebra_puzzle#LP-like_version і дещо заплутався.

Ось мінімальний приклад того, що відбувається в цьому коді.

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

Що таємниче для мене, це те, що відбувається в блозі.

Я з різних джерел розумію, що a <- b Оператор робить дію b і пов'язує це a. Але яка дія саме тут?

Я припускав, що це було values але якщо я коментую begin і end функціональні дзвінки та визначення, то хаскелл не знає, з чим займатися values більше Я думаю, це пов'язано з тим, що тест рівності в їхніх визначеннях є тим, що дозволяє хаскеллу визначити тип (я помиляюся?).

  1. У цьому випадку що точно є в дія тут
  2. Також як це робиться values знати, який обмежений тип застосовувати permutations до? Ця частина здається цілком таємничим.
  3. Нарешті, якщо я хочу залишити те саме код, як зазначено вище, але змінити його список всіх перестановок (не тільки одне, що задовольняє begin і end) як би це зробити?

Відповіді:

0 для відповіді № 1

Ви можете перекласти do позначення для позначення списку розуміння досить механічно:

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

Я дійсно не люблю це head і last бізнес хоч.