作为 Haskell 的新手,我正在阅读 StackOverflow 最受好评的问题、新问题等,而今天有这样一个:
我想“好吧,我会在不看答案的情况下尝试”。首先,我写道:
neighborsDistance [] = []
neighborsDistance [a] = []
neighborsDistance (x:y:xs) = abs (x - y) : neighborsDistance (y:xs)
那我就可以了minimum neighborsDistance [2,3,6,2,0,1,9,8] => 1
。
但我不太关心边缘情况是如何工作的,所以我想也许我会尝试使用 Maybe。我需要一种方法来调整递归规则以容忍“可能”的值,所以我在 Data.Maybe 上查看了Hoogle并发现fromMaybe
......它看起来像我想要的那样:
neighborsDistance [] = Nothing
neighborsDistance [a] = Just []
neighborsDistance (x:y:xs) = Just (abs (x - y) : fromMaybe [] neighborsDistance (y:xs))
但这给了我一个not in scope: fromMaybe
错误。主要问题是“为什么那不起作用?”
另一个问题通常是关于 Haskell 的思维方式,当看到这样的事情时。这是对Maybe的不好使用吗?为什么head
在空列表上调用时会抛出异常而不是返回 Maybe 类型?
我遇到的问题是试图用最小操作来统一距离计算。我假设你可以像这样打破它而不会失去显着的效率(这样它会以最小值或最大值或其他方式组成)?