gpt4 book ai didi

haskell 初始累加器 'null' 值

转载 作者:行者123 更新时间:2023-12-02 06:30:19 25 4
gpt4 key购买 nike

我有一个看似简单的 Haskell 问题,由于我的知识有限,我不确定要搜索什么术语才能解决它。

我试图解决 99 个 Haskell 问题中的第 8 个问题(从列表中删除连续的重复项),这就是我想出的:

compress :: (Eq a) => [a] -> [a]
compress list = compress' list ???
where
compress' [] _ = []
compress' (x:xs) last
| x == last = compress xs last
| otherwise = x : compress xs x

'???'只是一个占位符,这是我不确定该怎么做的地方。我想该片段的工作方式应该足够清楚,“last”是一种累加器,用于检查元素是否与之​​前的元素重复。现在,在这种情况下我可以给“last”什么初始值? (我想在大多数 OO 语言中类似于“null”)。

编辑:Tikhon 的回答有效,但我刚刚意识到我在原来的帖子中犯了一个错误,compress' 应该递归调用自身而不是压缩。因此,现在我的问题的“简单”解决方案是:

compress :: (Eq a) => [a] -> [a]
compress list = compress' list Nothing
where
compress' [] _ = []
compress' (x:xs) Nothing = x : compress' xs (Just x)
compress' (x:xs) (Just last)
| x == last = compress' xs (Just last)
| otherwise = x : compress' xs (Just x)

最佳答案

所以你的问题有两个答案。更直接的答案是,您可以使用 Maybe 来使某些东西可以为空,并且类型系统将确保您每次使用它时都检查它是否为 Nothing:

compress list = compress' list Nothing
where compress' [] _ = []
compress' (x:xs) Nothing = x : compress xs (Just x)
compress' (x:xs) (Just last)
| x == last = compress xs last
| otherwise = x : compress xs (Just x)

这个故事的寓意是,如果您有一个可能缺失的元素(即在其他语言中可能是 null),您可以将其包装在 Maybe 中。然后你要么有 Just x 要么有 Nothing,你可以对它进行模式匹配,就像你对列表进行模式匹配一​​样。

但是,在这种特殊情况下,我们可以有一个更简洁的解决方案。请注意,该元素仅在第一次您调用compress' 时丢失。我们可以通过在处理这种可能性的顶级 compress 函数中添加一个 case 来处理这个问题:

compress [] = []
compress (x:xs) = x : compress' xs x
where ...

本质上,如果我们在顶层函数中处理它,我们就可以避免在我们的辅助 compress' 函数中处理大小写,我们可以匹配传入的列表来决定什么做。

关于haskell 初始累加器 'null' 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39799887/

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