/ / Entender el operador Haskell (<-) - haskell

Comprender el operador Haskell (<-) - haskell

Estaba estudiando el código en https://rosettacode.org/wiki/Zebra_puzzle#LP-like_version y se confundió un poco.

Aquí hay un ejemplo mínimo de lo que está sucediendo en ese 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!"

lo que es misterioso para mí es lo que está sucediendo en el bloque do.

Entiendo por varias fuentes que el a <- b el operador hace una acción b y lo une a a. Pero, ¿cuál es la acción aquí exactamente?

Supuse que era values pero si comento el begin y end llamadas a funciones y definiciones, entonces haskell no sabe qué hacer con values nunca más. Supongo que esto se debe a que la prueba de igualdad en sus definiciones es lo que permite a Haskell inferir el tipo (¿estoy equivocado?).

  1. En ese caso, qué exactamente es el acción ¿aquí?
  2. También cómo lo hace values saber qué tipo delimitado aplicar permutations ¿a? Esta parte parece bastante misteriosa.
  3. Finalmente, si quería mantener el mismo código como el anterior, pero modifíquelo enumere todas las permutaciones (no solo el uno que satisface begin y end) ¿cómo lo haría?

Respuestas

0 para la respuesta № 1

Puedes traducir do notación para enumerar la notación de comprensión bastante mecánicamente:

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

Realmente no me gusta esto head y last negocios sin embargo.