是否有可能以某种方式使用元组作为列表理解的输入?或者也许是一个元组理解?我期望以下工作,但事实并非如此。
[x * 2 | x <- (4, 16, 32)]
我不能从一开始就使用列表,因为我的作业函数的给定签名是
success :: (Int, Int, Int) -> Int -> (Int, Int, Int) -> Bool
但是使用列表会更简单,因为任务的一部分需要我计算元组中有多少1
和20
。
答案 0 :(得分:6)
Control.Lens
重载了对所有长度的同类元组的遍历支持:
import Control.Lens
-- Convert to list:
(3, 4, 5)^..each -- [3, 4, 5]
(1, 2)^..each -- [1, 2]
-- modify elements:
(4, 16, 32)& each %~ \x -> x * 2 -- (8, 32, 64)
(1, 2)& each %~ (+1) -- (2, 3)
-- operator notation for common modifications (see Control.Lens.Operators):
(1, 2, 3)& each +~ 2 -- (3, 4, 5)
(1, 2, 3)& each *~ 2 -- (2, 4, 6)
-- monadic traversals (here each works like `traverse` for the list monad)
each (\x -> [x, x + 1]) (1, 2) -- [(1,2),(1,3),(2,2),(2,3)]
-- `each` is basically an overloaded "kitchen sink" traversal for
-- common containers. It also works on lists, vectors or maps, for example
[(3, 4), (5, 6)]& each . each +~ 1 -- [(4, 5), (6, 7)]
答案 1 :(得分:2)
您可以创建一个将三元组转换为列表的函数:
tripleToList :: (a, a, a) -> [a]
tripleToList (a, b, c) = [a, b, c]
然后你可以做
[x * 2 | x <- tripleToList (4, 16, 32)]