【问题标题】:Haskell combination of number and bool数字和布尔的 Haskell 组合
【发布时间】:2015-01-06 23:19:03
【问题描述】:

在 Haskell 中,当我输入一个有序数字列表时,如何创建一个包含数字和布尔值(真或假)的所有可能组合的列表?

例如 当我输入 [1,2]
输出是:

[ [(1,False),(2,False)]
, [(1,False),(2,True)]
, [(1,True),(2,False)]
, [(1,True), (2,True)] ]

【问题讨论】:

标签: haskell combinations


【解决方案1】:

list monad 可能是最容易理解的:

f xs = do
    bs <- replicateM (length xs) [False, True]  -- Obtain |xs| elements from the set of all possible booleans
    return (zip xs bs)                          -- Pair the elements of each list

结果是:

Prelude Control.Monad> f [1,2]
[[(1,False),(2,False)],[(1,False),(2,True)],[(1,True),(2,False)],[(1,True),(2,True)]]

【讨论】:

  • 或:f = mapM (\x -&gt; [(x, False), (x, True)])
【解决方案2】:
b1 n = sequence $ replicate n [False,True]

b2 xs = map (zip xs) (b1 (length xs))

例子:

*Main> b2 [1,2]
[[(1,False),(2,False)],[(1,False),(2,True)],[(1,True),(2,False)],[(1,True),(2,True)]]

【讨论】:

    【解决方案3】:

    使用列表推导

    [zip [1..] [x,y] | x<-[True,False], y<-[True,False]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-09
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多