【发布时间】:2017-02-06 10:37:23
【问题描述】:
我创建了以下 Haskell 函数来检查列表中 Orange 的最大连续出现次数:
import Data.Maybe
data Fruit = Apple | Orange
findMaxSubStr :: [Fruit] -> Maybe Int
findMaxSubStr xs = val xs 0 0
where val [] prev current = (max prev current)
val (Apple:xs) prev current = val xs (max prev current) 0
val (Orange:xs) prev current = val xs prev (current + 1)
我现在正在尝试集成 Maybe 类型,以防出现次数为 0。例如,我希望 [] 和 [Apple, Apple] 生成 Nothing 而不是 0。我应该如何进行?
此外,如果我想创建自己的函数以检查最大值,那么最好的方法是什么,而不是使用预构建的 max 函数?
【问题讨论】:
-
我会说 0 是对“此列表中橙色的最大连续出现次数是多少?”这个问题的完全合理的答案。鉴于您有这样的功能,您可以调用它并将答案与 0 进行比较:
-
当您返回相同的值(例如
0)时,添加Maybe包装器是一个好主意,原因有两个。 IE。当你想区分Nothing和Just 0时。在这里,添加包装器后,您将永远不会返回Just 0。在这种情况下,添加包装器几乎没有什么好处。具体来说,你想用length :: [a] -> Maybe Int代替普通的吗? -
max x y = if x <= y then y else xfrom source,对于这个简单的逻辑,我想不出更好的自定义构建函数。