我想使用函数映射到数组,但条件是已满。对于我的特殊问题,我有一个对象数组,只想在这个大数组的子数组上执行一个函数。
function :: a -> a
mapping :: [a] -> [a] -> [a]
mapping all sub = map (\x -> if (x `elem` sub) then function x else x) all
我该怎么做?
编辑:我知道这段代码有效,但是在我的课堂上这被认为是错误的设计,我们需要避免使用if语句,而需要使用警卫等等。
答案 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