使用另一个列表中具有匹配构造函数的项替换列表中的项

dan*_*dan 6 haskell

为了简化我面临的问题,假设这种数据类型:

data Item = X Int | Y Char deriving (Eq, Show..)
Run Code Online (Sandbox Code Playgroud)

和两个清单

let a = [X 1, Y 'g']
let b = [X 2]
Run Code Online (Sandbox Code Playgroud)

我需要使用相同的构造函数替换a第一个(或任何)项中的所有项b.结果将是:[X 2, Y 'g'].

有什么建议?

Sho*_*hoe 0

您可以创建一个函数来替换这些项目:

specialReplace :: Item -> Item -> Item
specialReplace (X x1) (X x2) = (X x1)
specialReplace (Y y1) (Y y2) = (Y y1)
specialReplace _ a = a
Run Code Online (Sandbox Code Playgroud)

进而:

foldr (\el list -> map (specialReplace el) list) a b
Run Code Online (Sandbox Code Playgroud)

将运行您的a列表并相应地应用相关的替换b。当然,如果列表中引入了多个X或s ,则最后将使用最后一个。Yb

Your live exampleAnother live example