5

在阅读有关MonadPlus的Haskell Wikibook时,我发现以下函数基本上采用 a和 a并在此类 char 等于字符串头时返回,否则:CharStringJust (char,tail)Nothing

char :: Char -> String -> Maybe (Char, String)
char c s = do
  let (c':s') = s
  if c == c' then Just (c, s') else Nothing

他们解释说这let (c':s') = s不会产生异常,因为它位于一个do块中,该块将评估Nothing模式何时失败,但是,事实并非如此,因为当我尝试它时:

*Main> char 'a' ""
*** Exception: exercice2.hs:5:7-17: Irrefutable pattern failed for pattern (c' : s')

所以我不得不将其重写为:

char' :: Char -> String -> Maybe (Char, String)
char' _ [] = Nothing
char' c (c':s') 
  | c == c' = Just (c,s')
  | otherwise = Nothing

它按预期工作......为什么会发生在我身上?

4

1 回答 1

7

我认为维基是错误的。他们可能将此与绑定通过 a提供的fail函数失败的事实混淆了。Monad所以下面的例子使用fail函数 from Maybe,它返回Nothing

char :: Char -> String -> Maybe (Char, String)
char c s = do
  (c':s') <- return s
  if c == c' then Just (c, s') else Nothing
于 2016-10-11T01:15:15.903 回答