/ / हास्केल को समझना (<-) ऑपरेटर - हैकेल

हास्केल को समझना (<-) ऑपरेटर - हैकेल

मैं कोड पर अध्ययन कर रहा था 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. उस मामले में वास्तव में क्या है the कार्रवाई यहाँ?
  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 हालांकि व्यापार ।