有条件的地图在Haskell

时间:2018-11-11 15:55:41

标签: haskell

我想使用函数映射到数组,但条件是已满。对于我的特殊问题,我有一个对象数组,只想在这个大数组的子数组上执行一个函数。

function :: a -> a

mapping :: [a] -> [a] -> [a]
mapping all sub = map (\x -> if (x `elem` sub) then function x else x) all 

我该怎么做?

编辑:我知道这段代码有效,但是在我的课堂上这被认为是错误的设计,我们需要避免使用if语句,而需要使用警卫等等。

2 个答案:

答案 0 :(得分:5)

对我来说似乎不好的设计部分是您没有考虑基本模式。由于assembly.jc具有pointed out,因此您应该真正赋予它自己的功能。

mapOnly :: (a -> Bool) -> (a -> a) -> [a] -> [a]
mapOnly p f = map $ \x -> if p x then f x else x

在这种情况下,使用if似乎很合理;真的很笨拙。

答案 1 :(得分:0)

如果您被迫使用守卫,那很简单。我认为if .. then .. else在这里是一个很好的模式。正如@dfeuer所说,在mapping的签名中包含谓词和函数。

mapping :: (a -> Bool) -> (a -> a) -> [a] -> [a]
mapping _ _ []     = []
mapping p f (a:as)
  | p a       = f a: mapping p f as
  | otherwise = a:mapping p f as