[英]Understanding Haskell (<-) operator
我在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推断类型的原因(我错了吗?)。
values
还如何知道将permutations
应用于哪个有界类型? 这部分似乎很神秘。 begin
和end
排列),我将如何做? 您可以相当机械地将do
符号转换为列出理解符号:
answers = [ zip nation color
| nation <- values, head nation == English
, color <- values, last color == Red
]
我真的不喜欢这个head
和last
虽然生意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.