gpt4 book ai didi

list - Haskell 一种替换字符串中字符的更好方法

转载 作者:行者123 更新时间:2023-12-05 08:36:51 25 4
gpt4 key购买 nike

我做了这个功能

replace :: Char -> Char -> [Char] -> [Char]
replace _ _ [] = []
replace a b (c:r)
| a == c = b : replace a b r
| otherwise = c : replace a b r

当我发现这个时,正在寻找一种更好的方式来编写它:

replace :: Char -> Char -> [Char] -> [Char]
replace a b = map $ \c -> if c == a then b else c

甚至没有写第三个参数,我不明白 $ 和\c 符号,但它有效,我想知道这里发生了什么

最佳答案

$ 运算符将函数应用于参数。我们可以将您的示例重写为

replace :: Char -> Char -> [Char] -> [Char]
replace a b = map (\c -> if c == a then b else c)

实用上,Haskellers 经常使用 $ 来避免括号。由于其他原因很少使用它。

关于 \c -> ...:这是一个匿名函数,也称为“lambda”。它代表以c为参数并返回...部分的函数。在您的情况下,该函数采用 c 并检查它是否等于 a,在这种情况下它返回 b,否则返回 C。我们可以在没有 lambda 的情况下重写代码,如下所示:

replace :: Char -> Char -> [Char] -> [Char]
replace a b = map myFun
where
myFun :: Char -> Char
myFun = \c -> if c == a then b else c

或者,将参数c移动到=的左边,如下:

replace :: Char -> Char -> [Char] -> [Char]
replace a b = map myFun
where
myFun :: Char -> Char
myFun c = if c == a then b else c

关于“缺少第三个参数”:Char -> Char -> [Char] -> [Char] 类型可以通过多种方式读取:

  • 接受一个参数 (Char) 并返回一个函数 (Char -> [Char] -> [Char]) 的函数类型
  • 接受两个参数(CharChar)并返回一个函数([Char] -> [Char])的函数类型
  • 采用三个参数(CharChar[Char])并返回列表([字符])

由于柯里化(Currying),所有这三种解释都是兼容的。的确,“二参”函数

foo :: A -> B -> B
foo x y = y

和函数

foo :: A -> B -> B
foo x = id -- id is the identity function B -> B

是一样的。

在您的示例中,如果需要,您可以将缺少的参数添加到 = 的两边,如下所示:

replace :: Char -> Char -> [Char] -> [Char]
replace a b xs = map myFun xs
where
myFun :: Char -> Char
myFun c = if c == a then b else c

在这段扩展代码中,您可以看到 map myFun xs 使用 map(库函数)将 myFun 应用于所有元素list xs,返回所有结果的列表。这样就有效的实现了你想要的代入。

但是,如果不添加第三个参数,

replace :: Char -> Char -> [Char] -> [Char]
replace a b = map myFun
where ...

我们仍然可以将 map myFun 解释为将函数 myFun::Char -> Char 转换为函数 [Char] -> [Char]。如果我们将后者解释为“双参数”函数,后者确实是 replace 的返回类型。也就是说,replace 'a' 'b' 是函数 [Char] -> [Char],它接受一个字符串并替换每个 'a' 在其中带有 'b'

关于list - Haskell 一种替换字符串中字符的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67424569/

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