根据Haskell中第三个列表的元素从两个列表中选择元素

时间:2015-03-04 16:49:25

标签: haskell

我有两个列表inputAinputB包含某些类型的项目和selectBool的列表inputA。我想构建一个列表,其中第i个元素是select的第i个元素,如果True的第i个元素是inputB,或者是第i个元素否则result = [if x then a else b | (x, a, b) <- zip3 select inputA inputB]

这可以这样做:

> [if x then a else b | (x,a,b) <- zip3 [True,False,False,True] [10..] [100..]]
[10,101,102,13]

例如:

mapIfElse

我想知道是否有一些内置函数,比如说result = mapIfElse select inputA inputB ,可以像这样用来产生相同的结果:

{{1}}

1 个答案:

答案 0 :(得分:4)

我知道没有内置函数,但您可以更轻松地实现它

import Data.Bool (bool)

-- I don't like bool's argument order
if_ :: Bool -> a -> a -> a
if_ cond a b = bool b a cond

-- If you are using base < 4.7 then Data.Bool.bool
-- does not exist so you can define if_ manually as
-- if_ True  a b = a
-- if_ False a b = b

mapIfElse :: [Bool] -> [a] -> [a] -> [a]
mapIfElse = zipWith3 if_

在我看来,这将是一个更惯用的实现,因为它描述了一组参数的操作,然后将该操作应用于参数列表。同样,我不知道要执行此操作的现有功能,但将来如果要搜索给定类型的函数,请先尝试hoogle