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

私にとって不思議なことは、doブロックで何が起きているかです。

私は様々な情報源から a <- b オペレータがアクションを実行する b それにバインドする a。しかし、ここの行動はどういうものですか?

私はそれが values しかし、もし私がコメントしたら begin そして end 関数の呼び出しと定義はhaskellは何をするのか分からない values もうこれは、定義の平等テストがhaskellに型を推測させるものだからです(間違っていますか?)。

  1. その場合、正確に何か その アクション ここに?
  2. またどのように values 適用する境界型を知る permutations に?この部分はかなり不思議そうです。
  3. 最後に、もし私が同じものを 上のようにコードを作成しますが、すべての順列をリストします( 満足するもの begin そして end)どうすればいい?

回答:

回答№1は0

あなたは翻訳することができます do 理解力の表記をかなり機械的にリストする表記法:

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

私は本当にこれが好きではない head そして last ビジネスですが。