/ / Understanding Haskell (<-) operator - haskell

Understanding Haskell (<-) operator - haskell

Ich studierte den Code über bei https://rosettacode.org/wiki/Zebra_puzzle#LP-like_version und wurde etwas verwirrt.

Hier ist ein minimales Beispiel dafür, was in diesem Code vor sich geht.

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

Was für mich geheimnisvoll ist, ist, was im Do-Block passiert.

Ich verstehe aus verschiedenen Quellen, dass die a <- b Bediener macht eine Aktion b und bindet es an a. Aber was ist hier genau los?

Ich nahm an, dass es war values aber wenn ich das ausdenke begin und end Funktionsaufrufe und Definitionen dann weiß Haskell nicht, was damit zu tun ist values nicht mehr. Ich denke, das liegt daran, dass der Gleichheitstest in ihren Definitionen das ist, was Haskell auf den Typ schließen lässt (bin ich falsch?).

  1. In diesem Fall was genau ist das Aktion Hier?
  2. Auch wie values wissen, welcher beschränkte Typ anzuwenden ist permutations zu? Dieser Teil scheint ziemlich mysteriös zu sein.
  3. Endlich, wenn ich das selbe behalten wollte Code wie oben, aber ändern Sie es alle Permutationen auflisten (nicht nur die eine, die befriedigt begin und end) Wie würde ich es tun?

Antworten:

0 für die Antwort № 1

Du kannst übersetzen do Notation, um Verstehensnotation ziemlich mechanisch aufzulisten:

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

Ich mag das wirklich nicht head und last Geschäft obwohl.