使用readMaybe读取自然数列表

时间:2017-05-28 20:55:34

标签: haskell monads maybe

我使用此函数以下列格式从字符串中读取自然数列表:[1, 2, 3]

readMaybeIntList :: String -> Maybe [Int]
readMaybeIntList line = case readMaybe line of
                          Just l -> return l
                          Nothing -> Nothing

现在它只适用于整数 - 检查数字是否自然的正确方法是什么?我应该修改Just l子句以检查所有数字是否都是>=0?从这种嵌套的Nothing子句返回Just是一个好主意吗?

2 个答案:

答案 0 :(得分:1)

您可以使用SomeStruct - 来自do的表示法和guard来避免过多的模式匹配:

Control.Monad

答案 1 :(得分:1)

好吧,如果您打算使用return来调用Maybe的monad实例,那么我想我可能会写:

import Text.Read
import Control.Monad

readMaybeNatList :: String -> Maybe [Int]
readMaybeNatList line = do
  ns <- readMaybe line
  guard $ all (>=0) ns
  return ns

这是Maybe monad的更惯用的应用。它是否比显式模式匹配(和monad-free)替代方案更清晰:

readMaybeNatList' :: String -> Maybe [Int]
readMaybeNatList' line =
  case readMaybe line of
    Just ns | all (>=0) ns -> Just ns
    _ -> Nothing

可能是意见和目标受众。