Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何将函数应用于列表的特定元素_Haskell - Fatal编程技术网

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]