gpt4 book ai didi

list - 仅替换列表中的元素一次 - Haskell

转载 作者:行者123 更新时间:2023-12-04 13:02:45 25 4
gpt4 key购买 nike

我只想在第一次出现时用新值替换列表中的元素。
我写了下面的代码,但是使用它,所有匹配的元素都会改变。

replaceX :: [Int] -> Int -> Int -> [Int]
replaceX items old new = map check items where
check item | item == old = new
| otherwise = item

如何修改代码以使更改仅发生在第一个匹配项上?

感谢您的帮助!

最佳答案

关键是mapf ( check 在您的示例中)仅就如何转换单个元素进行交流。他们不会就列表中的元素进行转换的程度进行沟通:map总是一直进行到最后。

map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs

让我们写一个新版本的 map --- 我叫它 mapOnce因为我想不出更好的名字。
mapOnce :: (a -> Maybe a) -> [a] -> [a]

关于这种类型签名有两点需要注意:
  • 因为我们可能会停止申请 f在列表的中途,输入列表和输出列表必须具有相同的类型。 (使用 map ,因为将始终映射整个列表,所以类型可以更改。)
  • f的类型未更改为 a -> a , 但到 a -> Maybe a .
  • Nothing将意味着“保持此元素不变,继续向下列表”
  • Just y将意味着“更改此元素,并保持其余元素不变”

  • 所以:
    mapOnce _ []     = []
    mapOnce f (x:xs) = case f x of
    Nothing -> x : mapOnce f xs
    Just y -> y : xs

    您的示例现在是:
    replaceX :: [Int] -> Int -> Int -> [Int]
    replaceX items old new = mapOnce check items where
    check item | item == old = Just new
    | otherwise = Nothing

    关于list - 仅替换列表中的元素一次 - Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14137172/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com