哈斯克尔:把它带到了可能的名单上

时间:2016-11-13 16:20:02

标签: haskell recursion monads

Maybe n的无限列表,从特定位置开始,只有Nothing项:

someNumbers :: [Maybe Int]
someNumbers = [Just 4, Just 3, Just 2, Just 1] ++ cycle [Nothing]

我想计算n对谓词p的满意度,在第一个Nothing停止:

howMany :: (Int -> Bool) -> [Maybe Int] -> Int

这是我提出的,显式递归:

howMany p ((Just n):rest)
| p n = 1 + (howMany p rest)
| otherwise = 0
howMany _ _ = 0

我想知道是否有更好的表达方式,利用高级Haskell抽象。

1 个答案:

答案 0 :(得分:4)

以下方法可行。

import Data.Maybe (isJust, maybe)
howMany p = length . filter (maybe False p) . takeWhile isJust

或者您也可以使用fromJust代替maybe。通常不鼓励像fromJust这样的部分功能,但在这种情况下它是安全的。

import Data.Maybe (isJust, fromJust)
howMany p = length . filter (p . fromJust) . takeWhile isJust