/ / Разбиране на 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 функционални повиквания и дефиниции тогава haskell не знае какво да прави с values вече. Предполагам, че това е така, защото тестът за равенство в техните дефиниции е това, което позволява на haskell да заключи типа (греша ли?).

  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 бизнес.