gpt4 book ai didi

haskell - 用另一个默认值 Haskell 替换默认值

转载 作者:行者123 更新时间:2023-12-04 01:31:13 24 4
gpt4 key购买 nike

我有以下代码可以正常工作

replacePointsWithZeros :: Eq a => a -> a -> [a] -> [a]
replacePointsWithZeros _ _ [] = []
replacePointsWithZeros replacee replacer (x:xs)
| replacee == x = replacer:replacePointsWithZeros replacee replacer xs
| otherwise = x:replacePointsWithZeros replacee replacer xs

但我想用默认值替换 replacee 和 replacer 参数,所以基本上我想要的是
replacePointsWithZeros :: Eq a => [a] -> [a]
replacePointsWithZeros [] = []
replacePointsWithZeros (x:xs)
| '.' == x = '0':replacePointsWithZeros xs
| otherwise = x:replacePointsWithZeros xs

但是,当我尝试它时,它会用一条消息提示类型,我不太明白,因为我对 Haskell 很陌生。我做错了什么,我该如何解决?

我假设问题出在这条线上
replacePointsWithZeros :: Eq a => [a] -> [a]

事实上,我使用 a 而不是 Char 但如果我将 a 切换到 Char 我会遇到 Eq 语句的问题

最佳答案

既然你写 '.' == x ,这意味着 xChar ,因此 (x:xs)Char 的列表s,所以[Char] ,或 String .

此外你写'0':x:作为输出,因此这意味着输出是 Char 的列表s 也是。因此,这意味着 replacePointsWithZeros 的签名是:

replacePointsWithZeros :: String -> String
replacePointsWithZeros [] = []
replacePointsWithZeros (x:xs)
| '.' == x = '0':replacePointsWithZeros xs
| otherwise = x:replacePointsWithZeros xs

您可以通过将条件放在映射函数中来使上述更懒惰:
replacePointsWithZeros :: String -> String
replacePointsWithZeros [] = []
replacePointsWithZeros (x:xs) = f x : replacePointsWithZeros xs
where f '.' = '0'
f x = x

我们可以使用 map函数而不是显式递归:
replacePointsWithZeros :: String -> String
replacePointsWithZeros = map f
where f '.' = '0'
f x = x

关于haskell - 用另一个默认值 Haskell 替换默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61001916/

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