gpt4 book ai didi

string - 交换 Haskell 字符串中的多对字符

转载 作者:行者123 更新时间:2023-12-04 00:36:59 26 4
gpt4 key购买 nike

我正在尝试编写一个 Haskell 函数,该函数接受一串字母对,并在所有字母组成的字符串中交换该对字母,但我想出的方法感觉很尴尬且不惯用。

我有

swap a b = map (\x-> if x == a then b else if x == b then a else x)
sub n = foldr (.) id (zipWith swap (head <$> splitOn "." n) (last <$> splitOn "." n)) ['A'..'Z']

效果很好

> sub "RB.XD.EU.ZM.IJ"
"ARCXUFGHJIKLZNOPQBSTEVWDYM"

> sub "YC.LU.EB.TZ.RB.XD.IJ"
"ARYXBFGHJIKUMNOPQESZLVWDCT"

但我是 Haskell 新手,感觉我的方法 — 尤其是我的 swap 辅助函数(我只在此处使用) — 比实际需要的更加复杂。

是否有更好、更惯用的方法来解决这个问题?尤其是利用我错过的语言功能、内置功能或库函数的功能?

最佳答案

对替换列表进行左折叠可以使代码更短:

import Data.List
import Data.List.Split

sub = foldl' swap ['A'..'Z'] . splitOn "." . reverse
where
swap az [a,b] = map (\x -> if x == a then b else if x == b then a else x) az

如果您不关心先交换 EB 还是 RB,则删除相反的内容。

如果您想更换而不是交换:

import Data.List
import Data.List.Split

replace needle replacement haystack =
intercalate replacement (splitOn needle haystack)

rep = foldl' replace' ['A'..'Z'] . splitOn "."
where
replace' az [a,b] = replace [a] [b] az

关于string - 交换 Haskell 字符串中的多对字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32317206/

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