Haskell 如何将函数应用于列表的特定元素
如何将函数仅应用于列表中的单个元素? 有什么建议吗 例如:Haskell 如何将函数应用于列表的特定元素,haskell,Haskell,如何将函数仅应用于列表中的单个元素? 有什么建议吗 例如: let list = [1,2,3,4,3,6] function x = x * 2 in ... 我只想将函数应用于3的第一次出现,然后停在那里 输出: List = [1,2,6,4,3,6] -- [1, 2, function 3, 4, 3, 6] 您需要维护某种类型的状态来指示值的第一个实例,因为map将对所有值应用函数 也许是这样的 map (\(b,x) -> if (b) then f x else
let list = [1,2,3,4,3,6]
function x = x * 2
in ...
我只想将函数
应用于3的第一次出现,然后停在那里
输出:
List = [1,2,6,4,3,6] -- [1, 2, function 3, 4, 3, 6]
您需要维护某种类型的状态来指示值的第一个实例,因为
map
将对所有值应用函数
也许是这样的
map (\(b,x) -> if (b) then f x else x) $ markFirst 3 [1,2,3,4,3,6]
及
我相信有一个更简单的方法,但这是我在感恩节前一天这个时候想到的最好的方法
以下是基于以下评论的另一种方法
> let leftap f (x,y) = f x ++ y
leftap (map (\x -> if(x==3) then f x else x)) $ splitAt 3 [1,2,3,4,3,6]
映射还是不映射,这是个问题 最好不要绘制地图 为什么??因为无论如何
map id==id
,并且您只想映射一个元素,第一个元素与给定的参数相等
因此,将列表一分为二,更改找到的元素,然后将它们粘在一起。简单
请参阅:span::(a->Bool)->[a]->([a],[a])
写入:revappend(xs:[a])(ys:[a])
==append(反向xs)ys
,仅有效
或者将所有部件融合到一个功能中。您可以直接使用手动递归或使用foldr
对其进行编码。记住
map f xs = foldr (\x r -> f x : r) [] xs
takeWhile p xs = foldr (\x r -> if p x then x : r else []) [] xs
takeUntil p xs = foldr (\x r -> if p x then [x] else x : r) [] xs
filter p xs = foldr (\x r -> if p x then x : r else r) [] xs
duplicate xs = foldr (\x r -> x : x : r) [] xs
mapFirstThat p f xs = -- ... your function
等等。尽管,
foldr
不会是一个直接的适合,因为您需要(\x xs r->…)
品种的组合功能。这就是所谓的准态性,通过将尾X
馈送到foldr
,您可以创建一个简单的函数,将一个数字乘以二:
times_two :: (Num a) => a -> a
times_two x = x * 2
然后只需在列表中搜索指定的元素,并对其应用times\u two
。类似这样的方法可能会奏效:
map_one_element :: (Eq a, Num a) => a -> (a -> a) -> [a] -> [a]
-- base case
map_one_element _ _ [] = []
-- recursive case
map_one_element x f (y:ys)
-- ff element is found, apply f to it and add rest of the list normally
| x == y = f y : ys
-- first occurence hasnt been found, keep recursing
| otherwise = y : map_one_element x f ys
其工作原理如下:
*Main> map_one_element 3 times_two [1,2,3,4,3,6]
[1,2,6,4,3,6]
您是否有任何尝试?此外,如果列表中有两个或更多的三个,会发生什么情况?
map(\x->if x==3,则函数x else x)列表
有关我的投票结果的详细信息,请参阅。“我没有尝试”是一个动机问题,而不是编程问题。花些时间学习Haskell教程,遇到编程问题时再来。请尝试自己实现它,无论是使用foldr
还是显式递归,然后就您尝试过的内容问一个更具体的问题。目前,你似乎希望其他人为你做工作,这不太适合问答网站。
*Main> map_one_element 3 times_two [1,2,3,4,3,6]
[1,2,6,4,3,6]