Haskell - 奇怪的 do 阻止行为
Haskell - Strange do block behavior
在阅读关于 MonadPlus 的 Haskell 维基百科 时,我发现以下函数基本上采用 Char
和 String
和 returns Just (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
它按预期工作...为什么会发生在我身上?
我认为维基是错误的。他们可能将此与 binds 通过 Monad
提供的 fail
函数失败这一事实混淆了。因此下面的示例 将 使用 Maybe
中的 fail
函数,其中 returns Nothing
:
char :: Char -> String -> Maybe (Char, String)
char c s = do
(c':s') <- return s
if c == c' then Just (c, s') else Nothing
在阅读关于 MonadPlus 的 Haskell 维基百科 时,我发现以下函数基本上采用 Char
和 String
和 returns Just (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
它按预期工作...为什么会发生在我身上?
我认为维基是错误的。他们可能将此与 binds 通过 Monad
提供的 fail
函数失败这一事实混淆了。因此下面的示例 将 使用 Maybe
中的 fail
函数,其中 returns Nothing
:
char :: Char -> String -> Maybe (Char, String)
char c s = do
(c':s') <- return s
if c == c' then Just (c, s') else Nothing