/ / Entendendo o operador Haskell (<-) - haskell

Entendendo o operador Haskell (<-) - haskell

Eu estava estudando o código no https://rosettacode.org/wiki/Zebra_puzzle#LP-like_version e ficou um pouco confuso.

Aqui está um exemplo mínimo do que está acontecendo nesse código.

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

o que é misterioso para mim é o que está acontecendo no bloco.

Eu entendo de várias fontes que o a <- b operador faz uma ação b e liga-o a a. Mas qual é a ação aqui exatamente?

Eu presumi que fosse values mas se eu comentar o begin e end chamadas de função e definições, em seguida, haskell não sabe o que fazer com values não mais. Eu acho que isso é porque o teste de igualdade em suas definições é o que permite haskell inferir o tipo (estou errado?).

  1. Nesse caso, o que exatamente é a açao Aqui?
  2. Além disso, como values saber qual tipo limitado aplicar permutations para? Esta parte parece bastante misteriosa.
  3. Finalmente, se eu quisesse manter o mesmo código como acima, mas modificá-lo lista todas as permutações (não apenas o aquele que satisfaz begin e end) como eu faria isso?

Respostas:

0 para resposta № 1

Você pode traduzir do notação para listar notação de compreensão bem mecanicamente:

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

Eu realmente não gosto disso head e last negócios embora.