繁体   English   中英

了解Haskell(<-)运算符

[英]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但是如果我注释掉beginend函数调用和定义,那么haskell将不知道该如何处理values 我猜这是因为它们定义中的相等性测试是让haskell推断类型的原因(我错了吗?)。

  1. 在这种情况下,这里的确切动作 什么?
  2. values还如何知道将permutations应用于哪个有界类型? 这部分似乎很神秘。
  3. 最后,如果我想保留与上面相同的代码,但对其进行修改,请列出所有排列(不仅仅是满足beginend排列),我将如何做?

您可以相当机械地将do符号转换为列出理解符号:

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

我真的不喜欢这个headlast虽然生意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM