Haskell - 奇怪的阻止行为

时间:2016-10-11 01:01:53

标签: haskell pattern-matching do-notation

在阅读关于MonadPlus Haskell Wikibook 时,我发现以下函数基本上需要TabFocusChar并返回String如果这样的字符串与字符串头相等,或者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')

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

1 个答案:

答案 0 :(得分:7)

我认为维基是错误的。他们可能会因为绑定失败而感到困惑,因为Monad函数a fail提供了失败。因此,以下示例使用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

buildscript {
repositories {
   jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle-experimental:0.8.1'
    classpath 'com.android.tools.build:gradle:2.2.1'
    classpath 'com.google.gms:google-services:3.0.0'


   }
}

allprojects {
  repositories {
     jcenter()
    }
  }