Select 两个列表中的元素基于 Haskell 中第三个列表的元素
Select elements from two lists based on elements of third list in Haskell
我有两个列表 inputA
和 inputB
包含某种类型的项目,第三个列表 select
包含 Bool
。我想构造一个列表,其中第 i 个元素是 inputA
的第 i 个元素,如果 select
的第 i 个元素是 True
,或者 inputA
的第 i 个元素inputB
否则。
可以这样做:
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
据我所知,没有针对此的内置函数,但您可以更轻松地将其实现为
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。
我有两个列表 inputA
和 inputB
包含某种类型的项目,第三个列表 select
包含 Bool
。我想构造一个列表,其中第 i 个元素是 inputA
的第 i 个元素,如果 select
的第 i 个元素是 True
,或者 inputA
的第 i 个元素inputB
否则。
可以这样做:
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
据我所知,没有针对此的内置函数,但您可以更轻松地将其实现为
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。